PHPのエラー処理やログ出力

PHPでのエラーハンドリングについて調査する。またPHPではどんなログが出力できるのか調査する。
  • PHPのエラー処理
  • PHPのログ出力機能
 PHPのエラー処理

 try, chach でエラーを捕捉できる。Javaとほぼ同じだ。ExceptionもErrorもThrowableインターフェースを実装しているところもJavaと同じ。(Exceptionに関してはPHP7から実装した模様)

 

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<?php
try {
 header('Content-Type: text/html; charset=utf-8');
 if (checkDir("foobar")) {
  echo "Success\n";
 } else {
  echo "Fail\n";
 }
} catch(Exception $e) {
 echo "Exception発生[" . $e->getMessage() . "] (\n" . $e . "\n)\n";
} catch(Error $e) {
 echo "Error発生[" . $e->getMessage() . "] (\n" . $e . "\n)\n";
}

function checkDir($dir) {
 if ($dir == NULL) {
  throw new Exception("dir is null");
 }
 if (!is_dir($dir)) {
  throw new Exception("invalid dir");
 }
 return true;
}
?>
</body>
</html>

 

 PHPのログ出力機能

 php.iniで指定できるログ出力設定のうち、代表的なものについて調べた。

 

■error_reporting
 出力したいエラーレベル名を"&"でつなげて列挙する。
 除外したいレベル名の前には"~"を付ける。
 指定可能なエラーレベルは、php.ini内のコメントを参照。
 開発中は、有用な情報が得られるため E_ALL を指定すべき。
 error_reporting=E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT

 

■display_errors
 On または Off または stderrを指定する。
 
 On :  エラーメッセージを標準出力に出す。
    標準出力に出すということは、つまりブラウザに出力されるということ。
    開発時は、Onにした方がエラーにすぐ気づき便利な場合が多いので推奨。

 Off: 標準出力に出力していたメッセージを抑止する。つまり、もともと
    標準エラー出力に出していたメッセージは、そのまま出続ける(error_log
    の設定がない場合などにはstderrに出力されるが、これまで抑止される
    ものではない)。
    ブラウザを操作しているエンドユーザにエラーメッセージを見せても
    しょうがない、しかも情報漏洩につながる恐れがあるため、本番環境
    では絶対にOffにすること。
    エラーメッセージは、Apacheのerror.logには常に出ているので、
    error.logをログ監視ソフト等で監視すれば良い話であり、標準出力に
    出す必要はない。

 stderr: エラーメッセージを(標準出力ではなく)標準エラー出力に出す。
    これは、CGICLIインタフェース使用時にのみ有効。Webモードの場合は
    Onと同等。
    なお、log_errors, およびerror_logの設定により、stderrに出力する
    機能もあるが、display_errors=stderrの機能とは別物である。よって
    それぞれの設定でstderrに出力することになった場合は、同様のメッセージ
    が2つ標準エラー出力に出ることもある。
    

■log_errors
    On または Off で指定する。
    エラーメッセージを下記のerror_logで指定した場所に記録するかどうか。
    Onを指定したが下記のerror_logの指定がない場合は、次のとおり。
     Webアクセスの場合   : apacheのerror.logに出力する。
     phpコマンド(CLI)の場合 : stderrに出力する。
    

■error_log
    エラーメッセージの出力先ファイル名を絶対パスで書く。syslogと書くと
    linuxの場合はsyslogに出力、Windowsの場合はイベントログに出力する。

 

 

---------------------------------------
 ■ITとことんのトップページ
  ┗■PHPのトップページ
    ┗■本ページ