PHPのエラー処理についてメモしています。PHPは言語としてtry catch文で例外処理が行えます。
本投稿では例外処理については記載していません。またどのようにエラーと例外を使い分けるかといったことも記載していません。
PHPはエラーに応じてレベルが設定されています。
定義済み定数 PHP: Manual
下記表は上記マニュアルより引用。
値 | 定数 | 説明 | 注記 |
---|---|---|---|
1 | E_ERROR (integer) | 重大な実行時エラー。これは、メモリ確保に関する問題のように復帰で きないエラーを示します。スクリプトの実行は中断されます。 | |
2 | E_WARNING (integer) | 実行時の警告 (致命的なエラーではない)。スクリプトの実行は中断さ れません。 | / |
4 | E_PARSE (integer) | コンパイル時のパースエラー。パースエラーはパーサでのみ生成されます。 | / |
8 | E_NOTICE (integer) | 実行時の警告。エラーを発しうる状況に遭遇したことを示す。 ただし通常のスクリプト実行の場合にもこの警告を発することがありうる。 | / |
16 | E_CORE_ERROR (integer) | PHPの初期始動時点での致命的なエラー。E_ERRORに 似ているがPHPのコアによって発行される点が違う。 | / |
32 | E_CORE_WARNING (integer) | /(致命的ではない)警告。PHPの初期始動時に発生する。 E_WARNINGに似ているがPHPのコアによって発行される 点が違う。 | / |
64 | E_COMPILE_ERROR (integer) | コンパイル時の致命的なエラー。E_ERRORに 似ているがZendスクリプティングエンジンによって発行される点が違う。 | / |
128 | E_COMPILE_WARNING (integer) | コンパイル時の警告(致命的ではない)。E_WARNINGに 似ているがZendスクリプティングエンジンによって発行される点が違う。 | / |
256 | E_USER_ERROR (integer) | ユーザーによって発行されるエラーメッセージ。E_ERROR に似ているがPHPコード上でtrigger_error()関数を 使用した場合に発行される点が違う。 | / |
512 | E_USER_WARNING (integer) | ユーザーによって発行される警告メッセージ。E_WARNING に似ているがPHPコード上でtrigger_error()関数を 使用した場合に発行される点が違う。 | / |
1024 | E_USER_NOTICE (integer) | ユーザーによって発行される注意メッセージ。E_NOTICEに に似ているがPHPコード上でtrigger_error()関数を 使用した場合に発行される点が違う。 | / |
2048 | E_STRICT (integer) | コードの相互運用性や互換性を維持するために PHP がコードの変更を提案する。 | PHP 5 より |
4096 | E_RECOVERABLE_ERROR (integer) | キャッチできる致命的なエラー。危険なエラーが発生したが、 エンジンが不安定な状態になるほどではないことを表す。 ユーザー定義のハンドラでエラーがキャッチされなかった場合 (set_error_handler() も参照ください) は、 E_ERROR として異常終了する。 | PHP 5.2.0 より |
8192 | E_DEPRECATED (integer) | 実行時の注意。これを有効にすると、 将来のバージョンで動作しなくなるコードについての警告を受け取ることができる。 | PHP 5.3.0 より |
16384 | E_USER_DEPRECATED (integer) | ユーザー定義の警告メッセージ。これは E_DEPRECATED と同等だが、 PHP のコード上で関数 trigger_error() によって作成されるという点が異なる。 | PHP 5.3.0 より |
32767 | E_ALL (integer) | サポートされる全てのエラーと警告。 PHP 5.4.0 より前のバージョンでは、E_STRICT レベルのエラーは除く。 | PHP 5.4.x では 32767、 PHP 5.3.x では 30719、 PHP 5.2.x では 6143、 それより前のバージョンでは 2047 でした。 |
エラーは下記のように分類できる。
Fatal Errorの例
<?php
echo(some()); // some関数を定義していない。Fatal Error発生。スクリプトを中断。
echo '終了'; // ここは処理されない。
?>
Noticeの例
<?php
echo($some); // someという変数を宣言していない。ここでNoticeが発生。
echo '終了'; // Noticeはスクリプトを中断しない。ここも実行され終了と表示される。
?>
ログは大きくデバッグのためのログとエラーログがあります。
php.iniのエラーログに関する詳細は下記を参考にしてください。
PHP: 実行時設定 – Manual
error_log関数はエラーログだけでなく通常のログ出力もできます。
error_log($message, 3, 'debug.log');
ディレクティブ | 内容 |
---|---|
error_reporting | エラー出力レベルを設定します。 デフォルト(PHP5.6) Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED |
display_errors | エラー(表示)のブラウザ送信の設定をします。デフォルトはOn(有効) |
log_errors | エラーをログファイルへ出力します。log_errorsブラウザへのエラー送信に関与しません。ブラウザへのエラー送信はdiplay_errosで行います。 |
error_log | エラー出力ファイルを指定します。 「ファイルはウェブサーバーユーザーで書き込めなければなりません。 syslog が指定されると、エラーはファイルではなく システムロガーに送られます。これは Unix では syslog(3) であり Windows NT ではイベントログのことです。システムロガーは Windows 95 ではサポートされていません。 syslog() も参照してください。 このディレクティブが設定されていない場合、エラーは SAPI エラーロガーに送信されます。これは、例えば Apache のエラーログ、 あるいは CLI なら stderr になります。」php公式マニュアル。 |
関数 | 内容 |
---|---|
bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] ) | 「定義されたエラー処理ルーチンにエラーメッセージを送信する」PHP公式マニュアル。 0 PHPシステムロガー 1 メールアドレス 2 なし 3 ファイル 4 SAP (SERVER API) |
error_reporting | 関数定義以降のエラー報告レベルを動的に指定します。 |
trigger_error | ユーザーエラーを発生させます。 |
set_error_handler | エラーのハンドリングを指定します。 |
restor_error_handler | set_error_handlerを呼び出した後に当関数を呼び出すとエラーハンドリングを元に戻します。 |
1) エラー出力レベル設定
error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING # 表示レベル設定(E_NOTICEとE_WARNING以外を報告)
2) エラーの画面出力禁止
display_errors=Off # 画面へエラー表示禁止(デフォルトはOff)
3) ログ出力を許可、出力ファイル指定
log_errors=On # ログ出力許可。
error_log = /var/log/php/error.log # ログ出力ファイル指定。 PHP実行ユーザーが書き込める必要があります。
log_errorsがOnでerror_logが指定されていないときはhttpdのエラーログへ出力されます。
<?php
set_error_handler(function ($errno, $errstr, $errfile, $errline){
echo "エラー情報: NO: {$errno}, メッセージ: {$errstr}, ファイル: {$errfile}, 行 {$errline}";
});
$a++; // エラー情報: NO: 8, メッセージ: Undefined variable: a, ファイル: /path/to/script.php, 行 9
restore_error_handler();
$b++; // Notice: Undefined variable: b in /path/to/script.php on line 11
errnoの8はE_NOTICEに対応します。
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。