PHPのエラーをブラウザに出すのではなく、ログファイルに吐くとか、メールで通知するとかする場合の設定。
PHPの本番環境では、少なくともブラウザ上にはエラーを表示させるべきでない。
よって、以下のコードを実行すると、「エラーは非表示」と表示されるようにphp.ini を設定しておくべき。(詳細)
<?php
if ( ini_get( 'display_errors' ) ) {
echo '<p>エラーを表示する</p>';
} else {
echo '<p>エラーは非表示</p>';
}
?>
ただし、本番環境でもエラーを捨てているだけではマズイこともある。
特に、Webアプリケーションのような複雑なものを作る場合。
その場合、エラーの情報は、ブラウザに出すのではなく、ログファイルに吐くとか、メールで通知するとか、考えないといけない。
そのような、PHPのエラーを書きだす場所を指定する方法。
PHPのエラーを書きだす場所を指定
とりあえず、以下のコードを実行してみると、下図にようになる。
<?php
/////////////// ここから //////////////////////////
set_error_handler( 'errhandler' );
function errhandler ( $errno, $errstr, $errfile, $errline, $errcontext ) {
$errs = array(
'errno' => $errno
, 'errstr' => $errstr
, 'errfile' => $errfile
, 'errline' => $errline
, 'errcontext' => $errcontext
);
// テスト出力
echo '<pre>';
print_r( $errs );
echo '</pre>';
}
/////////////// ここまで //////////////////////////
ini_set( 'display_errors' , 1 ); // エラーを表示する
error_reporting( E_ALL ); // 全てのエラーを表示する
echo $a; // エラーが発生するコード。
?>

これは、このページの最後に書いたコードに「ここから」「ここまで」で挟まれたコードを加えたもの。
set_error_handler( 'errhandler' );
で、エラーが発生したときに実行する関数名を指定する。
いまは、その関数名は「errhandler」になっている。
次に、その「errhandler」関数を作る。
$errnoにはエラーの番号(このページの表にある番号)、$errstrには説明の文言、$errfileにはエラーが発生したファイル名、$errlineにはエラーが発生したファイル内の行数が入る。 また、$errcontextには、そのときのシステム変数($_SERVERとか)が入る。
上の「errhandler」関数内では、それらのエラー情報を$errs配列に格納して、それをprint_r関数で表示しているだけ。
なお、display_errorsの値は1、つまり、「エラーを表示」にしておかないと動かない。(詳細)
また、error_reporting関数で表示するエラーの種類を選択しておく。(今は、E_ALLなので全部のエラーを表示する : 詳細 )
で、定義していない変数$aをechoしようとして、注意(E_NOTICE = 8)のエラーを発生させている。
実際には、「errhandler」関数の中で、ログファイルに書き込むとか、メールで通知するとかの処理を書く必要がある。
ま、ここはできるだけシンプルな処理にしといた方がいいと思うけど。
以上