Der Inhalt, der in diesem Artikel mit Ihnen geteilt wird, ist eine detaillierte Erklärung der Verwendung der Funktion set_error_handler() in PHP. Sie hat einen gewissen Referenzwert 🎜>set_error_handler-Funktion Die Funktion besteht darin, falsche Pfadlecks zu verhindern
Was ist ein falscher Pfadleck?
Wenn wir Programme schreiben, ist es unvermeidlich, dass es Probleme gibt (Probleme treten häufig auf ), 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 denke, dass die Angabe des Fehlerpfads notwendig ist.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
string set_error_handler ( callback error_handler [, int error_types])
Jetzt verwenden wir eine benutzerdefinierte Fehlerbehandlung, um den tatsächlichen Pfad 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
//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; } }
Auf diese Weise wird eine Fehlerbehandlungsfunktion angepasst. Wie kann man also die Fehlerbehandlung an diese benutzerdefinierte Funktion übergeben?
PHP-Code
// 应用到类 set_error_handler(array(&$this,"appError")); //示例的做法 set_error_handler("my_error_handler");
so einfach, so kann es sein gut Es löst effektiv den Widerspruch zwischen Sicherheit und Debugging-Komfort. Und Sie können auch darüber nachdenken, die Fehlermeldung schöner zu gestalten, damit sie zum Stil der Website passt.
Der Autor hat zwei Punkte genannt, die Aufmerksamkeit erfordern. Ich werde sie auch veröffentlichen, in der Hoffnung, die Aufmerksamkeit unserer Landsleute zu erregen:
E_ERROR , E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR und E_COMPILE_WARNING werden von diesem Handle nicht verarbeitet, dh sie werden auf die originellste Weise angezeigt. Diese Fehler werden jedoch durch Kompilierungs- oder PHP-Kernelfehler verursacht und treten unter normalen Umständen nicht auf.
Nach der Verwendung von set_error_handler() ist error_reporting() ungültig. Das heißt, alle Fehler (mit Ausnahme der oben genannten Fehler) werden zur Verarbeitung an die benutzerdefinierte Funktion übergeben.
Schließlich gab der ursprüngliche Autor ein weiteres Beispiel (was für eine ernsthafte und verantwortungsbewusste 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 } }
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung der Funktion set_error_handler() in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!