このスクリプトは PHP のカスタムエラーハンドラ を set_error_handler で登録し、特定のエラーはスキップしつつ、残りのエラー情報をログに出力します。
-
ハンドラ登録
set_error_handler(function ($errno, $errstr, $errfile, $errline) { … });
set_error_handlerに無名関数を渡すことで、PHP がエラーを検出したときにこの関数が呼び出されます。 -
スキップ対象エラーの判定
if (in_array($errno, [E_DEPRECATED, E_STRICT], true)) { return false; }
E_DEPRECATED(非推奨機能の使用)とE_STRICT(コードの厳密性に関する警告)は大量に出ることがあるため、ハンドラは何もしない(falseを返す)ことで PHP のデフォルトハンドラに処理を委ね、実質的に無視します。
-
エラー種別名の取得
$types = [ … ]; // エラー定数 → 文字列名 のマッピング $type = $types[$errno] ?? "Unknown Error"; $err_type = $types[$errno] ?? "Unknown Error";
エラー番号
$errnoを人が読める文字列に変換し、ログ出力に使用します。 -
エラーメッセージのログ出力
error_log("{$err_type} {$errfile}:{$errline}, $errstr");
エラー種別、発生ファイル、行番号、エラーメッセージを1行で記録します。
-
スタックトレースの取得と加工
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); foreach ($trace as $i => $frame) { if (isset($frame['file']) && strpos($frame['file'], 'phpstan.phar') !== false) { error_log("Skip phpstan stack trace\n"); break; } $file = $frame['file'] ?? '[internal function]'; $line = $frame['line'] ?? ''; $func = $frame['function'] ?? ''; error_log("#{$i} {$file}({$line}): {$func}()"); }
debug_backtraceで現在の呼び出しスタックを取得(引数は除外)。- 各フレームを走査し、
phpstan.pharが含まれるフレーム が現れたらそれ以降のトレースは不要としてbreak。
→ PHPStan(静的解析ツール)の内部呼び出しはノイズになるため除外。 - それ以外は
file(line): function()形式でログに出力。
-
ハンドラの戻り値
return false;
false(またはnull)を返すと、ユーザー定義ハンドラは処理を放棄し、PHP のデフォルトエラーハンドラが続行します。- ここでは常に
falseを返すので、エラーはログに残りつつ、通常の PHP エラーメッセージも表示されます。
| シナリオ | 目的 | 効果 |
|---|---|---|
| 大規模テストや CI 環境 | E_DEPRECATED・E_STRICT が大量に出るが無視したい |
ノイズが減り、重要な警告だけが目に入る |
| デバッグ時にスタックトレースが必要 | エラー発生箇所と呼び出し経路を把握したい | error_log に分かりやすいトレースが出力 |
| 静的解析ツール(PHPStan)と併用 | PHPStan の内部スタックが混入しないようにしたい | phpstan.phar 以降のフレームを除外し、ログがクリーンになる |
return falseにより PHP の標準エラーハンドラが実行されるので、画面上にもエラーメッセージが出ます。完全に抑制したい場合はreturn trueに変更してください。error_logの出力先は PHP の設定 (error_logディレクティブ) に依存します。環境に合わせて適切に設定してください。E_DEPRECATEDとE_STRICTをスキップすると、将来の互換性問題を見逃すリスクがあります。開発段階でだけ有効にし、リリース前に除外を外すことが推奨されます。