Home  >  Article  >  Backend Development  >  Use of PHP set_error_handler() function_PHP tutorial

Use of PHP set_error_handler() function_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 10:34:08834browse

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. A lot of people say it's 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 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?

set_error_handler()

PHP has provided the function set_error_handler() to customize error handling handles since 4.1.0, but few script writers know about it. The set_error_handler function can prevent error paths from being leaked, and of course has other functions.

  1. can be used to mask errors. If an error occurs, some information will be exposed to users, and it is very likely to become a tool for hackers to attack your website. Second, it makes users feel that your level is very low.
  2. You can write down error information and discover some problems in the production environment in time.
  3. Corresponding processing can be done. When an error occurs, a jump to a predefined error page can be displayed to provide a better user experience.
  4. It can be used as a debugging tool. Sometimes you have to debug something in the production environment, but you don’t want to affect the users who are using it.
  5. . . . .

The usage of set_error_handler is as follows:

string set_error_handler ( callback error_handler [, int error_types])

Now we use custom error handling to filter out the actual paths. Suppose there is a variable $admin, which we use to determine whether the visitor is an administrator (this determination can be made by IP or logged in user ID)

//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 handling to this custom function?

// 应用到类  
set_error_handler(array(&$this,"appError"));  
  
//示例的做法  
set_error_handler("my_error_handler");  

So easy, in this way, the contradiction between security and debugging convenience can be well solved. And you can also put some thought into making the error message more beautiful to match the style of the website.

The original author gave two points that need attention. I will also post them, hoping to attract the attention of our compatriots:

  1. E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, 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.
  2. After using set_error_handler(), error_reporting () will be invalid. That is, all errors (except the above 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.)

//先定义一个函数,也可以定义在其他的文件中,再用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);  
}  

Okay, to summarize, here are three uses of set_error_handler:

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  
   }  
}  

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/752326.htmlTechArticleWhen we write programs, it is inevitable that there will be problems (problems are often encountered), and when PHP encounters errors, The location, line number and reason of the error script will be given. Many people say that this is nothing...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn