Cet article partage avec vous l'utilisation détaillée de php set_error_handler(), qui a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer
Réimprimé : http:/ /us.php.net/manual/en/function.set-error-handler.php
fonction set_error_handler La fonction est de prévenir les fuites dans un mauvais chemin
Qu'est-ce qu'une fuite dans un mauvais chemin ?
Lorsque nous écrivons des programmes, il est inévitable qu'il y ait des problèmes (des problèmes sont souvent rencontrés ), et lorsque PHP rencontre une erreur, il donnera l'emplacement, le numéro de ligne et la raison de le script d'erreur
Beaucoup de gens disent que ce n'est pas grave. En effet, dans la phase de débogage, cela n'a pas vraiment d'importance, et je pense que donner le chemin de l'erreur est nécessaire.
Mais les conséquences d'une fuite du chemin réel sont inimaginables. Pour certains intrus, cette information est très importante. En fait, de nombreux serveurs ont désormais ce problème.
Certains administrateurs réseau ont simplement défini display_errors dans le fichier de configuration PHP sur Off pour résoudre le problème (il semble que nous l'ayons fait), mais je pense que cette méthode est trop négative.
Parfois, nous avons vraiment besoin de PHP pour renvoyer des informations d'erreur pour le débogage. Et lorsque quelque chose ne va pas, vous devrez peut-être également donner une explication à l’utilisateur ou même accéder à une autre page.
Alors, quelle est la solution ?
PHP a fourni la fonction set_error_handler() pour personnaliser les poignées de gestion des erreurs depuis la version 4.1.0, mais peu de rédacteurs de scripts le savent.
L'utilisation de set_error_handler est la suivante :
Code PHP
string set_error_handler ( callback error_handler [, int error_types])
Par exemple : Supposons qu'il existe une variable $admin, nous sommes utilisés pour déterminer si le visiteur est un administrateur (cette détermination peut être faite par IP ou par ID d'utilisateur connecté)
Code PhpDe cette façon, une fonction de gestion des erreurs est personnalisée. Alors, comment confier le traitement des erreurs à cette fonction personnalisée ?
//admin为管理员的身份判定,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; } }
Code Php
so easy,这样,就可以很好地解决安全和调试方便的矛盾了。而且你还可以花点心思,使错误提示更加美观以配合网站的风格。
原作者给出了两点需要注意的地方,我也放出来吧,希望引起广大同胞们的注意:
E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用最原始的方式显示出来。不过出现这些错误都是编 译或PHP内核出错,在通常情况下不会发生。
使用set_error_handler()后,error_reporting ()将会失效。也就是所有的错误(除上述的错误)都会交给自定义的函数处理。
最后,原作者又给出了一个示例(真是个认真负责的好人哈。呵呵)
Php代码
//先定义一个函数,也可以定义在其他的文件中,再用require()调用 function myErrorHandler($errno, $errstr, $errfile, $errline) { //为了安全起见,不暴露出真实物理路径,下面两行过滤实际路径 $errfile=str_replace(getcwd(),"",$errfile); $errstr=str_replace(getcwd(),"",$errstr); 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"; echo "Aborting...<br />\n"; exit(1); break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } /* Don't execute PHP internal error handler */ return true; } //下面开始连接MYSQL服务器,我们故意指定MYSQL端口为3333,实际为3306。 $link_id=@mysql_pconnect("localhost:3333","root","password"); set_error_handler(myErrorHandler); if (!$link_id) { trigger_error("出错了", E_USER_ERROR); }
嗯,根据上面的那些解释,以及原作者认真负责的态度,我想如果我还学不会这个set_error_handler函数,那么我真该去撞墙了。
好了,总结一下,下面是 set_error_handler 三种用法:
Php代码
class CallbackClass { function CallbackFunction() { // refers to $this } function StaticFunction() { // doesn't refer to $this } } function NonClassFunction($errno, $errstr, $errfile, $errline) { } // 三种方法如下: 1: set_error_handler('NonClassFunction'); // 直接转到一个普通的函数 NonClassFunction 2: set_error_handler(array('CallbackClass', 'StaticFunction')); // 转到 CallbackClass 类下的静方法 StaticFunction 3: $o =& new CallbackClass(); set_error_handler(array($o, 'CallbackFunction')); // 转到类的构造函数,其实本质上跟下面的第四条一样。 4. $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()函数的文章推荐10篇
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!