Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung der Verwendung der Funktion set error handler() in PHP

Zusammenfassung der Verwendung der Funktion set error handler() in PHP

怪我咯
怪我咯Original
2017-07-06 10:38:291043Durchsuche

Die Funktion

set_error_handler() legt eine benutzerdefinierte Fehlerbehandlungsfunktion fest. Diese Funktion wird verwendet, um zur Laufzeit eine eigene Fehlerbehandlungsmethode für den Benutzer zu erstellen. Diese Funktion gibt den alten Fehlerhandler zurück. Wenn sie fehlschlägt, gibt sie null zurück

Die Funktion set_error_handler() legt die benutzerdefinierte Fehlerbehandlungsfunktion fest. Diese Funktion wird verwendet, um zur Laufzeit eine eigene Fehlerbehandlungsmethode für den Benutzer zu erstellen. Diese Funktion gibt den alten Fehlerbehandler oder bei einem Fehler null zurück.

Schauen wir uns einige Beispiele an.

set_error_handler()

PHP stellt seit 4.1.0 die Funktion set_error_handler() eines benutzerdefinierten Fehlerbehandlungs-Handles bereit, aber nur sehr wenige Skriptautoren wissen es. Die Funktion set_error_handler kann verhindern, dass Fehlerpfade durchsickern, und verfügt natürlich über weitere Funktionen.

1. Kann zum Blockieren von Fehlern verwendet werden. Wenn ein Fehler auftritt, werden einige Informationen den Benutzern zugänglich gemacht und es ist sehr wahrscheinlich, dass sie zu einem Werkzeug für Hacker werden, um Ihre Website anzugreifen. Zweitens vermittelt es den Benutzern das Gefühl, dass Ihr Niveau sehr niedrig ist.

2. Sie können Fehlerinformationen aufschreiben und einige Probleme in der Produktionsumgebung rechtzeitig entdecken.

3. Bei Auftreten eines Fehlers kann ein Sprung zu einer vordefinierten Fehlerseite angezeigt werden, um eine bessere Benutzererfahrung zu ermöglichen.

4. Es kann als Debugging-Tool verwendet werden. Manchmal muss man etwas in der Produktionsumgebung debuggen, möchte aber die Benutzer, die es verwenden, nicht beeinträchtigen.

5. . . .

Die Verwendung von set_error_handler ist wie folgt:

Der Code lautet wie folgt:

view sourceprint?1 string set_error_handler ( callback error_handler [, int error_types])

Wir verwenden error_reporting(); Die angezeigte Fehlermeldung besteht aus drei Teilen: der Fehlermeldung, der absoluten Adresse der Fehlerdatei und der Anzahl der Zeilen, in denen der Fehler aufgetreten ist. Tatsächlich gibt es eine andere Art von Fehler. Array ( [type] => 1 [message] => Aufruf der undefinierten Methode SomeClass::somemedthod() [file] => /home/zhangy/www/aaaa/stasdf.php [line] => 67 ), ist es am besten, den absoluten Pfad der Seite nicht anderen preiszugeben, da dies sonst einigen Leuten die Möglichkeit gibt, sich zu beschweren. Um dies zu verhindern, verwenden viele Leute ini_set("display_errors",0);, um es direkt zu blockieren die Fehlermeldung. Das ist unbequem. Was ist, wenn wir die Informationen lesen möchten? Muss ich den Code jedes Mal ändern, wenn ich ihn überprüfe, oder muss ich die Konfiguration von Apache ändern und ihn neu starten?

PHP verfügt über die Funktion set_error_handler, um dieses Problem zu lösen

Die Verwendung ist wie folgt:

mixed set_error_handler ( callback $error_handler [, int $error_types = E_ALL | E_STRICT ] )

PHP-Funktion register_shutdown_function kann dieses Problem auch lösen

Die Verwendung ist wie folgt:

int register_shutdown_function ( string $func )

Ich persönlich denke, dass es mindestens drei Vorteile hat, die Fehlerfunktion selbst zu definieren,

1. Der Pfad wird nicht absolut angezeigt, was sicherer ist

2. Selbst wenn eine Fehlermeldung angezeigt wird, können wir die Fehlermeldung so verarbeiten, dass Benutzer dies nicht tun können Betrachten Sie solche Dinge als fatale Fehler. Die Benutzererfahrung sollte besser sein

3 Nach dem Start des Projekts müssen Sie den Benutzern manchmal noch bei der Lösung von Problemen helfen. Zu diesem Zeitpunkt ist es unvermeidlich, den Code zu ändern, aber wir müssen dies auch tun Fehlermeldungen melden, und es kann von Benutzern derzeit nicht gesehen werden, es ist sehr cool, eine Funktion wie set_error_handler zu verwenden.

Ich habe einen kleinen Test gemacht

<?php
 error_reporting(0);
register_shutdown_function(&#39;error_alert&#39;);
 function error_alert()
 {
 if(is_null($e = error_get_last()) === false)
 {
 set_error_handler(&#39;errorHandler&#39;);
 if($e[&#39;type&#39;] == 1){
 trigger_error("fatal error", E_USER_ERROR);
 }elseif($e[&#39;type&#39;] == 8){
 trigger_error("notice", E_USER_NOTICE);
 }elseif($e[&#39;type&#39;] == 2){
 trigger_error("warning", E_USER_WARNING);
 }else{
 trigger_error("other", E_USER_OTHER);
 }
 }else{
 echo "no error";
 }
 }
 set_error_handler(&#39;errorHandler&#39;);
function errorHandler($errno, $errstr, $errfile, $errline,$errcontext)
 {
 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";
 break;
 case E_USER_WARNING:
 echo "<b>My WARNING</b> [$errno] $errstr<br />n";
 echo " warning on line $errline in file $errfile";
 echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n";
 break;
 case E_USER_NOTICE:
 echo "<b>My NOTICE</b> [$errno] $errstr<br />n";
 echo " notice on line $errline in file $errfile";
 echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n";
 break;
 default:
 echo "Unknown error type: [$errno] $errstr<br />n";
 echo " warning on line $errline in file $errfile";
 echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n";
 break;
 }
 return true;
 }
class SomeClass {
 public function someMethod() {
 }
 }
SomeClass::someMedthod();
$a="asdf";
 foreach($a as $d){
 echo $d;
 }
 ?>

Jetzt verwenden wir eine benutzerdefinierte Fehlerbehandlung, um den tatsächlichen Pfad herauszufiltern. Angenommen, es gibt eine Variable $admin, mit der wir bestimmen, ob der Besucher ein Administrator ist (diese Bestimmung kann anhand der IP-Adresse oder der angemeldeten Benutzer-ID erfolgen).

//admin ist die Identität des Administrator Bestimmung, wahr ist der Administrator.
//Die benutzerdefinierte Fehlerbehandlungsfunktion muss über diese vier Eingabevariablen $errno, $errstr, $errfile, $errline verfügen, andernfalls ist sie ungültig.

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 haben Sie eine Fehlerbehandlungsfunktion angepasst. Wie übergeben Sie die Fehlerbehandlung an diese benutzerdefinierte Funktion?

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

So einfach, auf diese Weise kann der Widerspruch zwischen Sicherheit und Debugging-Komfort gut gelöst werden. Und Sie können auch darüber nachdenken, die Fehlermeldung schöner zu gestalten, damit sie zum Stil der Website passt.

Im obigen Beispiel habe ich die Fehlermeldung deaktiviert und meine eigene Funktion zur Fehlerbehandlung verwendet. Die obige Seite meldet einen schwerwiegenden Fehler. Wir können die Fehlermeldung verwenden und Verarbeitung.

Okay, um es zusammenzufassen, hier sind die drei Verwendungsmöglichkeiten von set_error_handler:

PHP-Code

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

Lassen Sie mich etwas Zeit nehmen, um Ihnen die PHP-Funktion set_error_handler() separat vorzustellen

Definition und Verwendung

set_error_handler() Funktionseinstellungen Benutzerdefinierte Fehlerbehandlungsfunktion.

Diese Funktion wird verwendet, um zur Laufzeit eine eigene Fehlerbehandlungsmethode des Benutzers zu erstellen.

Diese Funktion gibt den alten Fehlerbehandler oder bei einem Fehler Null zurück.

Grammatik

set_error_handler(error_function,error_types)

参数 描述

error_function 必需。规定发生错误时运行的函数。
error_types 可选。规定在哪个错误报告级别会显示用户定义的错误。默认是 "E_ALL"。

提示和注释

提示:如果使用了该函数,会完全绕过标准的 PHP 错误处理函数,如果必要,用户定义的错误处理程序必须终止 (die() ) 脚本。

注释:如果在脚本执行前发生错误,由于在那时自定义程序还没有注册,因此就不会用到这个自定义错误处理程序。

例子

<?php
//error handler function
function customError($errno, $errstr, $errfile, $errline)
 { 
 echo "<b>Custom error:</b> [$errno] $errstr<br />";
 echo " Error on line $errline in $errfile<br />";
 echo "Ending Script";
 die();
 }
//set error handler
set_error_handler("customError");
$test=2;
//trigger error
if ($test>1)
 {
 trigger_error("A custom error has been triggered");
 }
?>

输出:

Custom error: [1024] A custom error has been triggered
Error on line 19 in C:/webfolder/test.php
Ending Script

Das obige ist der detaillierte Inhalt vonZusammenfassung der Verwendung der Funktion set error handler() in PHP. 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