Inhaltsverzeichnis
set_error_handler()
Heim Backend-Entwicklung PHP-Tutorial PHP set_error_handler()函数的使用_PHP教程

PHP set_error_handler()函数的使用_PHP教程

Jul 13, 2016 am 10:34 AM
set_error_handler 报错

我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置、行数和原因。有很多人说,这并没有什么大不了。确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必要的。

但泄露了实际路径的后果是不堪设想的,对于某些入侵者,这个信息可是非常重要,而事实上现在有很多的服务器都存在这个问题。有些网管干脆把PHP配置文件中的display_errors设置为Off来解决(貌似我们就是这样做的),但本人认为这个方法过于消极。

有些时候,我们的确需要PHP返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待,甚至导航到另一页面。

那么,有啥解决办法呢?

set_error_handler()

PHP从4.1.0开始提供了自定义错误处理句柄的功能函数set_error_handler(),但很少数脚本编写者知道。set_error_handler这个函数可以很好地防止错误路径泄露,当然还有其它更多的作用。

  1. 可以用来屏蔽错误。 出现错误一来会把一些信息暴漏给用户,极有可能成为黑客攻击你网站的工具。 二来让用户觉得你的水平很挫。
  2. 可以记下错误的信息, 及时发现一些生产环境的出现的问题。
  3. 可以做相应的处理, 出错的时候可以显示跳转到预先定义好的出错页面,提供更好的用户体验。 
  4. 可以作为调试工具, 一些时候必须在生产环境调试一些东西, 但又不想影响正在使用的用户。
  5. 。。。。

set_error_handler的使用方法如下:

string set_error_handler ( callback error_handler [, int error_types])
Nach dem Login kopieren

现在我们就用自定义的错误处理把实际路径过滤掉。假设有一个变量$admin,我们是用来判断访问者是否是管理员的(可以通过IP或者登录的用户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;  
    }  
}  
Nach dem Login kopieren

这样就自定义了一个错误处理函数,那么怎么把错误的处理交给这个自定义函数呢?

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

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 ()将会失效。也就是所有的错误(除上述的错误)都会交给自定义的函数处理。

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

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

好了,总结一下,下面是 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  
   }  
}  
Nach dem Login kopieren

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/752326.htmlTechArticle我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置、行数和原因。有很多人说,这并没有什...
Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Die Spaltenanzahl stimmt nicht mit der Wertanzahl in Zeile 1 überein – So beheben Sie den MySQL-Fehler: Die Spaltennummer stimmt nicht mit dem Wert überein Die Spaltenanzahl stimmt nicht mit der Wertanzahl in Zeile 1 überein – So beheben Sie den MySQL-Fehler: Die Spaltennummer stimmt nicht mit dem Wert überein Oct 05, 2023 am 11:40 AM

So beheben Sie den MySQL-Fehler: Die Anzahl der Spalten stimmt nicht mit dem Wert überein. Wenn Sie die MySQL-Datenbank für Datenoperationen verwenden, wird manchmal die Fehlermeldung „Columncountdoesn'tmatchvaluecountatrow1“ angezeigt Anzahl der Spalten stimmt nicht mit der Anzahl der Werte überein. Dieser Fehler tritt normalerweise auf, wenn Daten eingefügt werden und die Anzahl der angegebenen Spalten nicht mit der Anzahl der eingefügten Werte übereinstimmt. In diesem Artikel werden spezifische Problemumgehungen beschrieben und Codebeispiele bereitgestellt. prüfen

Falsche Tabellendefinition; es kann nur eine automatische Spalte geben und diese muss als Schlüssel definiert werden – So beheben Sie den MySQL-Fehler: Falsche Tabellendefinition kann es nur eine automatische Spalte geben und diese muss als Schlüssel definiert werden Falsche Tabellendefinition; es kann nur eine automatische Spalte geben und diese muss als Schlüssel definiert werden – So beheben Sie den MySQL-Fehler: Falsche Tabellendefinition kann es nur eine automatische Spalte geben und diese muss als Schlüssel definiert werden Oct 05, 2023 am 11:05 AM

So beheben Sie den MySQL-Fehler: Falsche Tabellendefinition; es kann nur eine automatische Spalte geben, die als Schlüssel definiert werden muss. In den letzten Jahren wird die MySQL-Datenbank immer häufiger verwendet , wir stoßen oft auf verschiedene Fehlermeldungen. Ein häufiger Fehler ist „falsche Tabellendefinition; es kann nur eine automatische Spalte geben und diese muss als Schlüssel definiert werden“. Dieser Fehler tritt normalerweise auf, wenn wir eine Tabelle erstellen, was für Anfänger Kopfschmerzen bereiten kann. In diesem Artikel werden die Gründe für diesen Fehler detailliert analysiert und konkrete Angaben gemacht

MySQL-Fehler 10060 MySQL-Fehler 10060 Sep 12, 2023 am 11:00 AM

Zu den Lösungen für den MySQL-Fehler 10060 gehören die Überprüfung, ob der MySQL-Server normal läuft, die Überprüfung der Netzwerkverbindung, die Überprüfung der Firewall-Einstellungen, die Überprüfung der MySQL-Serverkonfiguration, die Überprüfung der MySQL-Benutzerberechtigungen, die Überprüfung der Netzwerkkonfiguration und die Überprüfung der maximalen Anzahl von Verbindungen des MySQL-Servers und verwenden Sie die IP-Adresse anstelle des Hostnamens und starten Sie den MySQL-Server neu usw. Detaillierte Einführung: 1. Überprüfen Sie, ob der MySQL-Server normal läuft. Stellen Sie zunächst sicher, dass der MySQL-Server läuft und den richtigen Port usw. überwacht.

Ursachenanalyse: HTTP-Anforderungsfehler 504 Gateway-Timeout Ursachenanalyse: HTTP-Anforderungsfehler 504 Gateway-Timeout Feb 19, 2024 pm 05:12 PM

Kurze Einführung in die Ursache des HTTP-Anfragefehlers: 504GatewayTimeout: Während der Netzwerkkommunikation interagiert der Client mit dem Server, indem er HTTP-Anfragen sendet. Allerdings kann es beim Absenden der Anfrage manchmal zu Fehlermeldungen kommen. Einer davon ist der 504GatewayTimeout-Fehler. In diesem Artikel werden die Ursachen und Lösungen für diesen Fehler untersucht. Was ist der 504GatewayTimeout-Fehler? GatewayTimeo

Lösung: Socket-Fehler bei der Verarbeitung von HTTP-Anfragen Lösung: Socket-Fehler bei der Verarbeitung von HTTP-Anfragen Feb 25, 2024 pm 09:24 PM

HTTP-Anfragefehler: Lösung für SocketError Bei Netzwerkanfragen treten häufig verschiedene Fehler auf. Eines der häufigsten Probleme ist SocketError. Dieser Fehler wird ausgegeben, wenn unsere Anwendung keine Verbindung mit dem Server herstellen kann. In diesem Artikel besprechen wir einige häufige Ursachen und Lösungen für SocketError. Zuerst müssen wir verstehen, was Socket ist. Socket ist ein Kommunikationsprotokoll, das Anwendungen ermöglicht

Schritt-für-Schritt-Anleitung zur schnellen Behebung von pyqt5-Installationsfehlern Schritt-für-Schritt-Anleitung zur schnellen Behebung von pyqt5-Installationsfehlern Jan 19, 2024 am 09:32 AM

Wenn Sie Python lernen und GUI-Anwendungen entwickeln möchten, ist PyQt5 eine sehr gute Wahl. Es handelt sich um eine gebundene Version der PyQt-Bibliothek unter Python, was das Aufrufen und Entwickeln der Qt-Grafikbibliothek sehr bequem macht. Allerdings können bei der Installation von PyQt5 manchmal Probleme auftreten. In dieser Anleitung finden Sie einige Schritte zur schnellen Lösung von Installationsfehlerproblemen sowie spezifische Codebeispiele. Stellen Sie also zunächst sicher, dass die Python-Version korrekt ist. PyQt5 ist eine Python-basierte Bibliothek

Unbekannte Spalte „Spaltenname' in der „Where-Klausel' – So beheben Sie den MySQL-Fehler: Unbekannte Spalte in der Where-Klausel Unbekannte Spalte „Spaltenname' in der „Where-Klausel' – So beheben Sie den MySQL-Fehler: Unbekannte Spalte in der Where-Klausel Oct 05, 2023 am 11:15 AM

Unknowncolumn'column_name'in'whereclause' – So beheben Sie den MySQL-Fehler: Unbekannte Spalte in der Where-Klausel. Es sind spezifische Codebeispiele erforderlich. MySQL ist ein weit verbreitetes relationales Datenbankverwaltungssystem, das die Verwendung von Structured Query Language (SQL) unterstützt. Speicherung, Verwaltung und Abruf von Daten. Bei der Verwendung von MySQL zum Abfragen treten jedoch manchmal Fehler auf. Einer der häufigsten Fehler ist: Unkno

Falsche Syntax in der Nähe von „error_keyword' – So beheben Sie den MySQL-Fehler: Syntaxfehler Falsche Syntax in der Nähe von „error_keyword' – So beheben Sie den MySQL-Fehler: Syntaxfehler Oct 05, 2023 pm 04:24 PM

Fehler sind eines der Probleme, auf die Entwickler beim Schreiben von MySQL-Abfrageanweisungen häufig stoßen. Einer der häufigsten Fehler ist „Incorrectsyntaxnear ‚error_keyword‘“ (Syntaxfehler in der Nähe von „error_keyword“). Diese Fehlermeldung kommt sehr häufig vor und bedeutet, dass in der MySQL-Abfrageanweisung ein Syntaxfehler vorliegt. In diesem Artikel erläutern wir die Lösung dieses Problems und stellen einige konkrete Codebeispiele bereit. Schauen wir uns zunächst an

See all articles