PHPのエラー処理
PHPでは、デフォルトのエラー処理は非常に簡単です。 エラーメッセージは、ブラウザ、ファイル名、行番号、エラーメッセージの記述を含むメッセージを送信します。
PHPのエラー処理
スクリプトとWebアプリケーションを作成する場合は、エラー処理は重要な部分です。 あなたのコードは、エラーチェックコードを欠いている場合は、あなたのプログラムは非常に専門外に見えるだけでなく、セキュリティリスクへの扉を開くことがあります。
このチュートリアルでは、PHPのエラー検出方法の中で最も重要なのいくつかを紹介します。
私たちはあなたの異なったエラー処理の方法を説明します:
- シンプルな「ダイ() "文
- カスタムエラーおよびエラーのトリガー
- エラー報告
基本的なエラー処理:ダイ()関数を使用します
最初の例では、テキストファイルを開き、簡単なスクリプトを示しています。
<?php $file=fopen("welcome.txt","r"); ?>
ファイルが存在しない場合は、このようなエラーが発生します。
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in /www/w3big/test/test.php on line 2
上記のようなエラーメッセージを得ることからユーザーを防ぐために、我々は存在するファイルにアクセスする前にファイルを検討しました:
<?php if(!file_exists("welcome.txt")) { die("文件不存在"); } else { $file=fopen("welcome.txt","r"); } ?>
ファイルが存在しない場合さて、あなたは次のようにこのエラーメッセージが表示されます。
文件不存在
それがエラー後にスクリプトを終了するには、単純なエラー処理メカニズムを使用していますので、前のコードと比較すると、上記のコードは、より効率的です。
しかし、単にスクリプトは常に正しい方法ではありません終了します。 私たちは、エラーを処理するための代替のPHP関数を見てみましょう。
カスタムエラーハンドラの作成
カスタムエラーハンドラを作成することは非常に簡単です。 私たちは、単にエラーがPHPで発生したときに呼び出すことができる特別な関数を作成します。
この関数は、少なくとも二つのパラメータ(エラーレベルとエラーメッセージ)を処理できる必要がありますが、5までのパラメータを受け入れることができます(必要に応じて:ファイル、行番号とエラー・コンテキスト):
文法
error_function(error_level,error_message, error_file,error_line,error_context)
パラメータ | 説明 |
---|---|
error_level | 必須。 エラーは、ユーザー定義のエラー報告レベルとして定義されています。 これは、数値でなければなりません。 エラー報告レベル:次の表を参照してください。 |
ERROR_MESSAGE | 必須。 ユーザー定義エラーのエラーメッセージは述べています。 |
ERROR_FILE | オプション。 ファイル名指定されたエラーが発生しました。 |
error_line | オプション。 所定の行番号エラーが発生しました。 |
error_context | オプション。 エラーが使用し、その値に発生したときにすべての変数を含む配列を指定します。 |
エラー報告レベル
これらのエラーレポートレベルは、エラーのエラーハンドラのカスタム処理の異なる種類があります:
值 | 常量 | 描述 |
---|---|---|
2 | E_WARNING | 非致命的 run-time 错误。不暂停脚本执行。 |
8 | E_NOTICE | run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。 |
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>Error:</b> [$errno] $errstr<br>"; echo "脚本结束"; die(); }
上記のコードは、単純なエラー処理機能です。 それがトリガされると、エラーレベルとエラーメッセージを取得します。 その後、エラーレベルとメッセージを出力して、スクリプトを終了します。
今、私たちはエラー処理関数を作成している、我々はときに機能を起動するかを決定する必要があります。
設定エラーハンドラ
PHPのデフォルトのエラーハンドラは、組み込みのエラーハンドラです。 私たちは、スクリプトのデフォルトのエラーハンドラの継続時間の上に変換関数をしようとしています。
それだけでいくつかのエラーに適用されるため、スクリプトが別のエラーを処理するためのさまざまな方法とすることができるようにするには、エラーハンドラを変更することができます。 しかしながら、この場合には、我々はすべてのエラーのエラーハンドラ我々の習慣のために使用します。
set_error_handler("customError");
我々はカスタム関数は、すべてのエラーを処理したいので、はset_error_handler()はパラメータを1つだけ必要な、エラー・レベルを指定するには、第二引数を追加することができます。
例
存在しない出力変数にしようとすると、エラーハンドラをテストします:
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } // 设置错误处理函数 set_error_handler("customError"); // 触发错误 echo($test); ?>
次のように上記のコードの出力は、次のとおりです。
Error: [8] Undefined variable: test
トリガーエラー
スクリプトでエラーが有用であるときに、ユーザ入力がトリガされていないユーザー入力の位置データ。 PHPは、これは、完了するのでtrigger_error()関数によって行われます。
例
この例では、「テスト」変数は、エラーが発生し、「1」よりも大きい場合。
<?php $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1"); } ?>
次のように上記のコードの出力は、次のとおりです。
Notice: 变量值必须小于等于 1 in /www/test/w3big.php on line 5
あなたがエラーレベルがトリガされる指定することができ、二番目のパラメータを追加することで、どこでも、スクリプトでエラーをトリガすることができます。
エラーの可能なタイプ:
- E_USER_ERROR - 致命的なユーザー生成された実行時エラー。 回復不能なエラー。 スクリプトの実行は中断されます。
- E_USER_WARNING - 非致命的なユーザー生成の実行時の警告。 スクリプトの実行は中断されません。
- E_USER_NOTICE - デフォルト。 ユーザーが生成した実行時の通知。 スクリプトが見つかったときにエラーが発生することがありますが、また、通常動作スクリプトで発生することがあります。
例
「試験」変数がより大きい場合、この例では、「1」は、E_USER_WARNINGエラーが発生します。 これはE_USER_WARNINGを発生した場合、我々は、カスタムエラーハンドラを使用して、スクリプトを終了します。
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "脚本结束"; die(); } // 设置错误处理函数 set_error_handler("customError",E_USER_WARNING); // 触发错误 $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1",E_USER_WARNING); } ?>
次のように上記のコードの出力は、次のとおりです。
Error: [512] 变量值必须小于等于 1 脚本结束
今、私たちは独自のエラーを作成する方法を学んできたこと、およびそれらをトリガーする方法、のエラーログを見てみましょう。
エラーログ
デフォルトの場合には、error_logの設定がphp.iniで設定されているによると、PHPは、記録するエラー記録システムやファイルサーバに送信します。 error_log()関数を使用することで、指定したファイルまたはリモート宛先にエラーログを送信することができます。
これは、特定のエラーの通知を受け取るための良い方法である電子メールで自分自身にエラーメッセージを送信します。
エラーメッセージが電子メールで送信されます
特定のエラーが発生した場合は、次の例では、我々は、エラーメッセージを表示して電子メールを送信してスクリプトを終了します。
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "已通知网站管理员"; error_log("Error: [$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); } ?>
次のように上記のコードの出力は、次のとおりです。
Error: [512] 变量值必须小于等于 1 已通知网站管理员
次のように上記のコードから受信したメッセージは、次のとおりです。
Error: [512] 变量值必须小于等于 1
このメソッドは、すべてのエラーには適していません。 従来のサーバーでエラーが記録するためのデフォルトのPHPのロギングシステムを使用してでなければなりません。