Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Verwendung von PHP set_error_handler()

Detaillierte Verwendung von PHP set_error_handler()

不言
不言Original
2018-04-10 15:35:141865Durchsuche

Der in diesem Artikel geteilte Inhalt ist die detaillierte Verwendung von php set_error_handler(), die einen bestimmten Referenzwert hat. Freunde in Not können darauf verweisen

Nachdruck: http ://us.php.net/manual/en/function.set-error-handler.php

set_error_handler-Funktion Die Funktion ist die Vermeidung von Fehlern im falschen Pfad

Was ist Fehler im falschen Pfad?

Wenn wir Programme schreiben, ist es unvermeidlich, dass es Probleme gibt (Probleme treten häufig auf Detaillierte Verwendung von PHP set_error_handler()), und wenn PHP auf einen Fehler stößt, gibt es den Speicherort, die Zeilennummer und den Grund dafür an das Fehlerskript

Viele Leute sagen, es sei keine große Sache. Tatsächlich spielt das in der Debugging-Phase keine Rolle, und ich halte die Angabe des Fehlerpfads für notwendig.

Aber die Folgen des Durchsickerns des tatsächlichen Pfads sind unvorstellbar. Für einige Eindringlinge sind diese Informationen tatsächlich sehr wichtig.

Einige Netzwerkadministratoren setzen display_errors in der PHP-Konfigurationsdatei einfach auf Aus, um das Problem zu lösen (anscheinend haben wir das getan), aber ich denke, diese Methode ist zu negativ.

Manchmal brauchen wir PHP wirklich, um Fehlerinformationen zum Debuggen zurückzugeben. Und wenn etwas schief geht, müssen Sie dem Benutzer möglicherweise auch eine Erklärung geben oder sogar zu einer anderen Seite navigieren.

Also, was ist die Lösung?

PHP stellt seit 4.1.0 die Funktion set_error_handler() zum Anpassen von Fehlerbehandlungs-Handles zur Verfügung, aber nur wenige Skriptautoren kennen sie.

Die Verwendung von set_error_handler ist wie folgt:



PHP-Code Detaillierte Verwendung von PHP set_error_handler()

  1. string set_error_handler ( callback error_handler [, int error_types])
    Jetzt verwenden wir eine benutzerdefinierte Fehlerbehandlung, um die tatsächlichen Pfade herauszufiltern .

Zum Beispiel: Angenommen, es gibt eine Variable $admin, wir werden verwendet, um zu bestimmen, ob der Besucher ein Administrator ist (diese Bestimmung kann anhand der IP oder der angemeldeten Benutzer-ID erfolgen)

PHP-Code



Detaillierte Verwendung von PHP set_error_handler()Auf diese Weise wird eine Fehlerbehandlungsfunktion angepasst. Wie kann man also die Fehlerbehandlung an diese benutzerdefinierte Funktion übergeben?

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

PHP-Code



Detaillierte Verwendung von PHP set_error_handler()

so easy,这样,就可以很好地解决安全和调试方便的矛盾了。而且你还可以花点心思,使错误提示更加美观以配合网站的风格。

 

原作者给出了两点需要注意的地方,我也放出来吧,希望引起广大同胞们的注意:

 

  1. E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用最原始的方式显示出来。不过出现这些错误都是编 译或PHP内核出错,在通常情况下不会发生。

  2. 使用set_error_handler()后,error_reporting ()将会失效。也就是所有的错误(除上述的错误)都会交给自定义的函数处理。

 

最后,原作者又给出了一个示例(真是个认真负责的好人哈。呵呵)

 



Php代码  Detaillierte Verwendung von PHP set_error_handler()

//先定义一个函数,也可以定义在其他的文件中,再用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&#39;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函数,那么我真该去撞墙了。 Detaillierte Verwendung von PHP set_error_handler()

 

 

好了,总结一下,下面是 set_error_handler 三种用法:

 



Php代码  Detaillierte Verwendung von PHP set_error_handler()

class CallbackClass {  
   function CallbackFunction() {  
       // refers to $this  
   }  
  
   function StaticFunction() {  
       // doesn&#39;t refer to $this  
   }  
}  
  
function NonClassFunction($errno, $errstr, $errfile, $errline) {  
}  
  
// 三种方法如下:  
  
1: set_error_handler(&#39;NonClassFunction&#39;);  // 直接转到一个普通的函数 NonClassFunction  
  
2: set_error_handler(array(&#39;CallbackClass&#39;, &#39;StaticFunction&#39;)); // 转到 CallbackClass 类下的静方法 StaticFunction  
  
3: $o =& new CallbackClass();  
    set_error_handler(array($o, &#39;CallbackFunction&#39;));  // 转到类的构造函数,其实本质上跟下面的第四条一样。  
  
4. $o = new CallbackClass();  
  
  
// The following may also prove useful:  
  
class CallbackClass {  
   function CallbackClass() {  
       set_error_handler(array(&$this, &#39;CallbackFunction&#39;)); // the & is important  
   }  
     
   function CallbackFunction() {  
       // refers to $this  
   }  
}

相关推荐:

有关php set_error_handler()函数的文章推荐10篇 



Das obige ist der detaillierte Inhalt vonDetaillierte Verwendung von PHP set_error_handler(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn