Home > Article > Backend Development > Detailed explanation of the usage of set_error_handler() function in php
The content shared with you in this article is a detailed explanation of the usage of the set_error_handler() function in PHP. It has certain reference value. Friends in need can refer to the
set_error_handler function. The function is to prevent wrong path leakage
What is wrong path leakage?
When we write programs, there will inevitably be problems (problems are often encountered ), and when PHP encounters an error, it will give the location, line number and reason of the error script
Many people say that this is not a big deal. Indeed, in the debugging phase, this really doesn't matter, and I think giving the error path is necessary.
But the consequences of leaking the actual path are unimaginable. For some intruders, this information is very important. In fact, many servers now have this problem.
Some network administrators simply set the display_errors in the PHP configuration file to Off to solve the problem (it seems like we did this), but I think this method is too negative.
Sometimes, we really need PHP to return error information for debugging. And when something goes wrong, you may also need to give the user an explanation or even navigate to another page.
So, what’s the solution?
PHP has provided the function set_error_handler() for custom error handling handles since 4.1.0, but few script writers know it.
The usage of set_error_handler is as follows:
Php code
string set_error_handler ( callback error_handler [, int error_types])
Now we will use custom error handling to filter out the actual path.
For example: Suppose there is a variable $admin, we are used to determine whether the visitor is an administrator (this determination can be made by IP or logged in user ID)
Php code
//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; } }
In this way, an error handling function is customized, so how to hand over error processing to this custom function?
Php code
// 应用到类 set_error_handler(array(&$this,"appError")); //示例的做法 set_error_handler("my_error_handler");
so easy, so you can solve it well There is a conflict between safety and debugging convenience. And you can also put some thought into making the error message more beautiful to match the style of the website.
The author has given two points that need attention. I will also post them, hoping to attract the attention of our compatriots:
E_ERROR , E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, and E_COMPILE_WARNING will not be processed by this handle, that is, they will be displayed in the most original way. However, these errors are caused by compilation or PHP kernel errors and will not occur under normal circumstances.
After using set_error_handler(), error_reporting () will be invalid. That is, all errors (except the above-mentioned errors) will be handed over to the custom function for processing.
Finally, the original author gave another example (he is such a serious and responsible person. Haha)
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 } }
The above is the detailed content of Detailed explanation of the usage of set_error_handler() function in php. For more information, please follow other related articles on the PHP Chinese website!