set_error_handler() 関数は、ユーザー定義のエラー処理関数を設定します。この関数は、実行時にユーザー独自のエラー処理メソッドを作成するために使用されます。この関数は古いエラー ハンドラーを返すか、失敗した場合は null を返します。
以下の例を見てください。
set_error_handler()
PHP は 4.1.0 以降、カスタム エラー処理ハンドルの関数 set_error_handler() を提供していますが、それを知っているスクリプト作成者はほとんどいません。 set_error_handler 関数はエラー パスの漏洩を防ぐことができますが、もちろん他の関数もあります。
1. エラーをブロックするために使用できます。 エラーが発生すると、一部の情報がユーザーに公開され、ハッカーが Web サイトを攻撃するツールとなる可能性が非常に高くなります。 次に、ユーザーにあなたのレベルが非常に低いと感じさせます。
2. エラー情報を書き留めて、本番環境の問題を時間内に発見できます。
3. エラーが発生した場合、対応する処理を実行して、より良いユーザーエクスペリエンスを提供するために、事前定義されたエラーページにジャンプできます。
4. 実稼働環境で何かをデバッグする必要がある場合に、それを使用しているユーザーに影響を与えたくない場合があります。
5. 。 。 。
set_error_handler の使用方法は次のとおりです:
view sourceprint?1 string set_error_handler ( callback error_handler [, int error_types])
error_reporting(); を使用して表示されるエラー メッセージには、エラー メッセージ、エラー ファイルの絶対アドレス、エラーが発生した行数の 3 つの部分が含まれます。実際には、別の種類のエラーがあります。 Array ( [type] => 1 [message] => 未定義メソッド SomeClass::somemedthod() の呼び出し [file] => /home/zhangy/www/aaaa/stasdf.php [line] => 67 )、ページの絶対パスを他人に公開しないことが最善です。そうしないと、一部の人が苦情を言う機会が与えられるため、多くの人は ini_set("display_errors",0); を使用して直接ブロックします。エラーメッセージ。これは不便です。情報を読みたい場合はどうすればよいでしょうか。チェックするたびにコードを変更する必要がありますか、それともApacheの設定を変更して再起動する必要がありますか?
phpには、この問題を解決する関数set_error_handlerがあります
使用法は次のとおりです:
mixed set_error_handler ( callback $error_handler [, int $error_types = E_ALL | E_STRICT ] )
php function register_shutdown_function でも解決できますこの問題
使用法は次のとおりです:
int register_shutdown_function ( string $func )
個人的には、エラー関数を自分で定義することには少なくとも 3 つの利点があると思います。ファイルは表示されないので安全です
2、エラーメッセージが表示された場合でも、致命的なエラーなどをユーザーが認識できないようにエラーメッセージを処理することができます。ユーザー エクスペリエンスは良好である必要があります
3. プロジェクトが開始された後も、ユーザーが問題を解決できるように支援する必要がある場合があります。このとき、コードを変更することは避けられませんが、エラー メッセージを報告する必要もあります。この時点で、set_error_handler のような関数を使用するのは非常に便利です。
ちょっとしたテストをしました
<?php error_reporting(0); register_shutdown_function('error_alert'); function error_alert() { if(is_null($e = error_get_last()) === false) { set_error_handler('errorHandler'); if($e['type'] == 1){ trigger_error("fatal error", E_USER_ERROR); }elseif($e['type'] == 8){ trigger_error("notice", E_USER_NOTICE); }elseif($e['type'] == 2){ trigger_error("warning", E_USER_WARNING); }else{ trigger_error("other", E_USER_OTHER); } }else{ echo "no error"; } } set_error_handler('errorHandler'); function errorHandler($errno, $errstr, $errfile, $errline,$errcontext) { switch ($errno) { case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />n"; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n"; break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />n"; echo " warning on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />n"; echo " notice on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n"; break; default: echo "Unknown error type: [$errno] $errstr<br />n"; echo " warning on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n"; break; } return true; } class SomeClass { public function someMethod() { } } SomeClass::someMedthod(); $a="asdf"; foreach($a as $d){ echo $d; } ?>次に、カスタム エラー処理を使用して実際のパスを除外します。変数 $admin があるとします。これは、訪問者が管理者であるかどうかを判断するために使用します (この判断は IP またはログイン ユーザー ID によって行うことができます)
//admin は管理者の ID 判断であり、true は管理者。
//カスタム エラー処理関数には、これら 4 つの入力変数 $errno、$errstr、$errfile、$errline が必要です。そうでない場合は無効になります。
function my_error_handler($errno,$errstr,$errfile,$errline) { //如果不是管理员就过滤实际路径 if(!admin) { $errfile=str_replace(getcwd(),"",$errfile); $errstr=str_replace(getcwd(),"",$errstr); } switch($errno) { case E_ERROR: echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) n"; echo "程序已经停止运行,请联系管理员。"; //遇到Error级错误时退出脚本 exit; break; case E_WARNING: echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) n"; break; default: //不显示Notice级的错误 break; } }
このようにしてエラー処理関数をカスタマイズしました。では、このカスタム関数にエラー処理をどのように引き渡すのでしょうか?
// 应用到类 set_error_handler(array(&$this,"appError")); //示例的做法 set_error_handler("my_error_handler");とても簡単です。このようにして、セキュリティとデバッグの利便性の間の矛盾をうまく解決できます。また、Web サイトのスタイルに合わせてエラー メッセージをより美しくすることも考えられます。
上記の例では、エラー メッセージをオフにし、独自の関数を使用してエラーを処理しました。上記のページでは、errorHandler を使用して、報告されたエラー メッセージを制御および処理できます。
要約すると、set_error_handler の 3 つの使用法は次のとおりです:
PHP コード
class CallbackClass { function CallbackFunction() { // refers to $this } function StaticFunction() { // doesn't refer to $this } } function NonClassFunction($errno, $errstr, $errfile, $errline) { } // 三种方法如下: set_error_handler(‘NonClassFunction'); // 直接转到一个普通的函数 NonClassFunction set_error_handler(array(‘CallbackClass', ‘StaticFunction')); // 转到 CallbackClass 类下的静方法 StaticFunction $o =& new CallbackClass(); set_error_handler(array($o, ‘CallbackFunction')); // 转到类的构造函数,其实本质上跟下面的第四条一样。 . $o = new CallbackClass(); // The following may also prove useful class CallbackClass { function CallbackClass() { set_error_handler(array(&$this, ‘CallbackFunction')); // the & is important } function CallbackFunction() { // refers to $this } }少し時間をかけて PHP の set_error_handler() 関数を紹介します 定義と使用法 set_error_handler() 関数設定 ユーザー定義のエラー処理関数。 この関数は、実行時にユーザー独自のエラー処理メソッドを作成するために使用されます。 この関数は古いエラー ハンドラーを返すか、失敗した場合は null を返します。 構文set_error_handler(error_function,error_types)パラメータの説明error_function 必須。エラーが発生したときに実行する関数を指定します。
error_types オプション。ユーザー定義エラーをどのエラー報告レベルで表示するかを指定します。デフォルトは「E_ALL」です。
ヒントとメモ
<?php //error handler function function customError($errno, $errstr, $errfile, $errline) { echo "<b>Custom error:</b> [$errno] $errstr<br />"; echo " Error on line $errline in $errfile<br />"; echo "Ending Script"; die(); } //set error handler set_error_handler("customError"); $test=2; //trigger error if ($test>1) { trigger_error("A custom error has been triggered"); } ?>
输出:
Custom error: [1024] A custom error has been triggered
Error on line 19 in C:/webfolder/test.php
Ending Script
更多PHP中set error handler函数用法小结相关文章请关注PHP中文网!