PHPで、エラーの出力先を変える

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;		// エラーが発生するコード。

?>

error030

これは、このページの最後に書いたコードに「ここから」「ここまで」で挟まれたコードを加えたもの。

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」関数の中で、ログファイルに書き込むとか、メールで通知するとかの処理を書く必要がある。

ま、ここはできるだけシンプルな処理にしといた方がいいと思うけど。

以上

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA