エラー処理 : PHP

Pocket

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 でした。

エラーは下記のように分類できる。

  • 処理を中断するエラー
    処理を中断するエラーはset_error_handlerでハンドリングできません(ただしcatch可能な致命的エラーはハンドリングが可能です)。

    • Fatal Error(致命的なエラー : E_ERROR 値1)
    • Parse Error(構文エラー : E_PARSE 値4)
  • 処理を中断しないエラー
    処理を中断しないエラーはset_error_handlerでハンドリングできます。

    • Warning(警告 : E_WARNING 値2)
    • Notice(注意 : E_NOTICE 値8)

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');

php.iniのエラー関連ディレクティブ

ディレクティブ 内容
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を呼び出した後に当関数を呼び出すとエラーハンドリングを元に戻します。

エラー関連の定義済み定数

PHP: 定義済み定数 – Manual

画面出力せずログへ出力する例

1) エラー出力レベル設定

error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING   # 表示レベル設定(E_NOTICEとE_WARNING以外を報告)

PHP: error_reporting – Manual

2) エラーの画面出力禁止

display_errors=Off # 画面へエラー表示禁止(デフォルトはOff)

3) ログ出力を許可、出力ファイル指定

log_errors=On                      # ログ出力許可。
error_log = /var/log/php/error.log # ログ出力ファイル指定。 PHP実行ユーザーが書き込める必要があります。  

log_errorsがOnでerror_logが指定されていないときはhttpdのエラーログへ出力されます。

エラーハンドリング(set_error_handler)の例

<?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に対応します。

人気記事 はてなブックマーク

この日記のはてなブックマーク数