PHP の set_error_handler を完全解説!初心者でもわかる独自エラーハンドリングの作り方
生徒
「PHPでエラーが出たときに、自分で好きな方法で処理することってできますか?」
先生
「できますよ。PHPには set_error_handler() という仕組みがあり、エラーが起きたときに自分で作った関数を呼び出すことができます。」
生徒
「自分でエラー処理を作れるって便利ですね!どんな場面で使うんですか?」
先生
「たとえば開発中にエラーの内容をわかりやすく表示したり、本番環境でエラーをユーザーに見せないようにして裏でログだけ記録したりできます。では実際に仕組みから解説していきましょう!」
1. PHP の set_error_handler() とは?
PHPの set_error_handler() は、「エラーが発生したときに呼び出される関数を、自分で指定できる仕組み」です。これを使うと、通常であればブラウザに直接表示されるエラー内容を、あなたの好きな処理で受け取り、ログに保存したり、メール通知したり、画面にはやさしいメッセージを表示することができます。
たとえば、通常ならPHPはエラーが発生すると画面に内容を表示します。しかし本番環境ではエラー内容がユーザーに見えてしまうと危険です。サーバーのファイル名や内部構造が漏れてしまう可能性があるためです。そこで set_error_handler() を使えば、画面には「問題が発生しました」とだけ表示し、内部ではエラーログに記録することができます。
2. 独自エラーハンドラーの基本構造
独自のエラーハンドリングを作るには、「自分で関数を作り、それを set_error_handler() に登録する」という流れになります。イメージとしては「エラーをキャッチする専用の窓口を自分で作る」ような感じです。
function myErrorHandler($errno, $errstr, $errfile, $errline) {
error_log("[Error $errno] $errstr ($errfile:$errline)");
echo "エラーが発生しました。しばらくしてから再度お試しください。";
}
set_error_handler("myErrorHandler");
上記の例では、エラーが発生すると myErrorHandler() が呼ばれます。そしてエラー内容をログに保存して、画面にはユーザー向けメッセージを表示します。
この仕組みを知ることで、エラー対応が一気にレベルアップします。本番環境でエラーが出てもユーザーは気づかず、裏側だけでログを確認できるようになるため、セキュリティ面にも強くなります。
3. set_error_handler のパラメータの意味
set_error_handler() に登録する関数は、基本的に次の4つのパラメータを受け取ります。
- $errno:エラーの種類(Warning など)
- $errstr:エラーの内容(メッセージ)
- $errfile:エラーが起きたファイル名
- $errline:エラーが起きた行番号
これらの情報を使えば、エラーの原因を特定しやすくなり、ログとして保存する際にもとても役に立ちます。
4. カスタムハンドラーでエラーをログに記録する
実際にエラー内容をログファイルに記録しつつ、画面には出さない例を紹介します。
function logOnlyHandler($errno, $errstr, $errfile, $errline) {
$log = date("Y-m-d H:i:s") . " [$errno] $errstr ($errfile:$errline)";
error_log($log, 3, __DIR__ . "/error.log");
}
set_error_handler("logOnlyHandler");
// わざとエラーを発生
echo $undefined;
このコードで実行される流れは次の通りです。
- 未定義変数
$undefinedを使いエラー発生 logOnlyHandlerが呼ばれる- エラー内容が
error.logに保存される - 画面には何も表示されない
こうすることで、ユーザーには一切エラー情報を見せず、管理側だけがログを確認できる仕組みが作れます。
5. set_error_handler を使うときの注意点
非常に便利な set_error_handler() ですが、いくつか注意点があります。
● 注意1:Fatal Error には対応できない
set_error_handler() は Notice や Warning を処理できますが、Fatal Error(致命的エラー)は処理できません。これはPHPが実行を続けられない種類のエラーだからです。
● 注意2:エラーを無視しないようにする
ログを記録せずに何も表示しない設計にすると、不具合に気づけなくなります。必ずログには記録するようにしましょう。
● 注意3:本番環境と開発環境で使い分ける
開発環境ではエラーを画面に表示、本番では非表示でログに保存、など使い分けが必要です。環境ごとに設定できるようにしておくと便利です。
6. 実務でよく使われるエラーハンドリングの構成例
最後に、実務でよく使われる構成例を紹介します。
function errorHandler($errno, $errstr, $errfile, $errline) {
$log = "[" . date("Y-m-d H:i:s") . "] ($errno) $errstr in $errfile on line $errline\n";
error_log($log, 3, __DIR__ . "/runtime_error.log");
if ($errno === E_USER_ERROR) {
echo "重大な問題が発生しました。";
}
}
set_error_handler("errorHandler");
この方法だと、エラーの種類を判断しながら処理を変えたり、重要なエラーだけ通知することができるようになります。PHPアプリケーションの安全性と品質を大きく向上させるための、大切なテクニックです。