PHP では、デフォルトのエラー処理は簡単です。ファイル名、行番号、およびエラーを説明するメッセージを含むエラー メッセージがブラウザに送信されます。
エラー処理は、スクリプトや Web アプリケーションを作成する際の重要な部分です。コードにエラー検出コーディングが欠けていると、プログラムは専門的ではないように見え、セキュリティ リスクへの扉が開かれてしまいます。
このチュートリアルでは、PHP での最も重要なエラー検出方法をいくつか紹介します。
さまざまなエラー処理方法について説明します。
単純な「die()」ステートメント
カスタムエラーとエラートリガー
エラーレポート
最初の例は、テキスト ファイルを開く単純なスクリプトを示しています。
<?php$file=fopen("welcome.txt","r");?>
ファイルが存在しない場合は、次のようなエラーが表示されます。
警告: fopen(welcome.txt) [function.fopen]: ストリームを開けませんでした: 2 行目の /www/codercto/test/test.php にそのようなファイルまたはディレクトリはありません
上記のようなエラー メッセージがユーザーに表示されるのを避けるために、ファイルにアクセスする前にファイルが存在するかどうかを確認します。
<?phpif(!file_exists("welcome.txt")){ die("ファイルが存在しません");}else{ $file=fopen("welcome.txt","r");}?>
ファイルが存在しない場合は、次のようなエラー メッセージが表示されます。
ファイルが存在しません
上記のコードは、単純なエラー処理メカニズムを使用してエラー後にスクリプトを終了するため、前のコードよりも効率的です。
ただし、単にスクリプトを終了することが常に適切であるとは限りません。エラーを処理するための代替 PHP 関数を調べてみましょう。
カスタム エラー ハンドラーの作成は非常に簡単です。 PHP でエラーが発生したときに呼び出せる専用の関数を作成しただけです。
この関数は少なくとも 2 つのパラメータ (エラー レベルとエラー メッセージ) を処理できる必要がありますが、最大 5 つのパラメータ (オプション: ファイル、行番号、エラー コンテキスト) を受け入れることができます。
error_function(error_level,error_message,error_file,error_line,error_context)
パラメータ | 説明する |
---|---|
エラーレベル | 必須。ユーザー定義エラーのエラー報告レベルを指定します。数値である必要があります。以下の表を参照してください: エラー報告レベル。 |
エラーメッセージ | 必須。ユーザー定義エラーのエラー メッセージを指定します。 |
エラーファイル | オプション。エラーが発生したファイル名を指定します。 |
エラー行 | オプション。エラーが発生した行番号を指定します。 |
エラーコンテキスト | オプション。エラーが発生したときに使用されていた各変数とその値を含む配列を指定します。 |
これらのエラー レポート レベルは、ユーザー定義のエラー ハンドラーによって処理されるさまざまな種類のエラーです。
価値 | 絶え間ない | 説明する |
---|---|---|
2 | E_警告 | 致命的ではない実行時エラー。スクリプトの実行を一時停止しないでください。 |
8 | E_通知 | 実行時の通知。スクリプトがエラーの可能性を検出したときに発生しますが、スクリプトが正常に実行されているときにも発生する可能性があります。 |
256 | E_USER_ERROR | ユーザーが生成した致命的なエラー。これは、プログラマが PHP 関数trigger_error()を使用して設定する E_ERROR に似ています。 |
512 | E_USER_WARNING | 致命的ではないユーザー生成の警告。これは、プログラマが PHP 関数 trigger_error() を使用して設定する E_WARNING に似ています。 |
1024 | E_USER_NOTICE | ユーザーが生成した通知。これは、プログラマが PHP 関数trigger_error()を使用して設定する E_NOTICE に似ています。 |
4096 | E_RECOVERABLE_ERROR | トラップ可能な致命的なエラー。 E_ERROR と似ていますが、ユーザー定義のハンドラーによってキャッチされる可能性があります。 (set_error_handler() を参照) |
8191 | E_ALL | すべてのエラーと警告。 (PHP 5.4 では、E_STRICT は E_ALL の一部になります) |
次に、エラーを処理する関数を作成しましょう。
function customError($errno, $errstr){ echo "<b>エラー:</b> [$errno] $errstr<br>"; }
上記のコードは、単純なエラー処理関数です。トリガーされると、エラー レベルとエラー メッセージが取得されます。次に、エラー レベルとメッセージを出力し、スクリプトを終了します。
エラー処理関数を作成したので、それをいつ起動するかを決定する必要があります。
PHP のデフォルトのエラー ハンドラーは、組み込みエラー ハンドラーです。スクリプトの実行時に、上記の関数をデフォルトのエラー ハンドラーに変換します。
エラー ハンドラーは特定のエラーにのみ適用されるように変更できるため、スクリプトはさまざまな方法でさまざまなエラーを処理できます。ただし、この場合は、すべてのエラーに対してカスタム エラー ハンドラーを使用します。
set_error_handler("カスタムエラー");
カスタム関数ですべてのエラーを処理する必要があるため、set_error_handler() に必要な引数は 1 つだけであり、2 番目の引数を追加してエラー レベルを指定できます。
存在しない変数を出力して、このエラー ハンドラーをテストします。
<?php// エラー処理関数 function customError($errno, $errstr){ echo "<b>エラー:</b> [$errno] $errstr";}// エラー処理関数を設定します set_error_handler("customError") ;//トリガーエラー echo($test);?>
上記のコードの出力は次のようになります。
エラー: [8] 未定義の変数: テスト
ユーザーがスクリプトにデータを入力する場合、ユーザーの入力が無効な場合にエラーをトリガーすると便利です。 PHP では、このタスクはtrigger_error() 関数によって実行されます。
この例では、「test」変数が「1」より大きい場合、エラーが発生します。
<?php$test=2;if ($test>1){trigger_error("変数値は 1 以下である必要があります");}?>
上記のコードの出力は次のようになります。
注意: 変数値は、/www/test/codercto.php の 5 行目で 1 以下である必要があります。
スクリプト内の任意の場所でエラーをトリガーでき、2 番目のパラメーターを追加することで、トリガーされるエラー レベルを指定できます。
考えられるエラーの種類:
E_USER_ERROR - ユーザーが生成した致命的な実行時エラー。エラーは回復できません。スクリプトの実行が中断されました。
E_USER_WARNING - 致命的ではないユーザー生成の実行時警告。スクリプトの実行は中断されません。
E_USER_NOTICE - デフォルト。ユーザーが生成した実行時通知。スクリプトがエラーの可能性を検出したときに発生しますが、スクリプトが正常に実行されているときにも発生する可能性があります。
この例では、「test」変数が「1」より大きい場合、E_USER_WARNING エラーが発生します。 E_USER_WARNING が発生した場合は、カスタム エラー ハンドラーを使用してスクリプトを終了します。
<?php// エラー処理関数 function customError($errno, $errstr){ echo "<b>エラー:</b> [$errno] $errstr<br>"; echo "スクリプトの終了"; ; }//エラー処理関数を設定 set_error_handler("customError",E_USER_WARNING);//エラーをトリガー $test=2;if ($test>1){ trigger_error("変数値は 1 以下である必要があります",E_USER_WARNING);}?>
上記のコードの出力は次のようになります。
エラー: [512] 変数値は 1 以下である必要があります。スクリプトの終了
独自のエラーを作成する方法とそれをトリガーする方法を学習したので、エラー ログを見てみましょう。
デフォルトでは、PHP は php.ini の error_log 設定に応じて、エラー ログをサーバーのログ システムまたはファイルに送信します。 error_log() 関数を使用すると、指定したファイルまたはリモートの宛先にエラー レコードを送信できます。
エラー メッセージを自分に電子メールで送信することは、特定のエラーの通知を受け取る良い方法です。
以下の例では、特定のエラーが発生した場合、エラー メッセージを含む電子メールを送信し、スクリプトを終了します。
<?php// エラー処理関数 function customError($errno, $errstr){ echo "<b>エラー:</b> [$errno] $errstr<br>"; echo "Web サイト管理者に通知されました"; error_log ("エラー: [$errno] $errstr",1, "[email protected]","From: [email protected]");}//エラー処理関数を設定します set_error_handler("customError",E_USER_WARNING); // エラーをトリガーします $test=2;if ($test>1){trigger_error("変数値は 1 以下である必要があります",E_USER_WARNING);} ?>
上記のコードの出力は次のようになります。
エラー: [512] 変数値は 1 以下である必要があります。Web サイト管理者に通知されました。
上記のコードから受信したメールは次のようになります。
エラー: [512] 変数値は 1 以下である必要があります
この方法はすべてのエラーに適しているわけではありません。一般的なエラーは、デフォルトの PHP ログ システムを使用してサーバーに記録される必要があります。