Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung der Verwendung der Set-Error-Handler-Funktion in PHP

Zusammenfassung der Verwendung der Set-Error-Handler-Funktion in PHP

高洛峰
高洛峰Original
2017-01-06 14:09:491131Durchsuche

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 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 davon. 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 Methode zur Verwendung von set_error_handler lautet wie folgt:

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

Die Fehlermeldung, die wir bei Verwendung von error_reporting() sehen, besteht aus drei Teilen: der Fehlermeldung, der absoluten Adresse der Fehlerdatei, und die Nummer der Zeile, in der 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 hat 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 die eigene Definition der Fehlerberichtsfunktion mindestens drei Vorteile hat:

1. Der absolute Pfad der Datei wird nicht angezeigt, was sicherer ist

2 Auch wenn eine Fehlermeldung erscheint, können wir die Fehlermeldung so verarbeiten, dass Benutzer solche Dinge nicht als schwerwiegende Fehler erkennen können. 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 Verwendungen 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 es vorzustellen Wir stellen Ihnen die Definition und Verwendung der PHP-Funktion set_error_handler() vor.

Die Funktion set_error_handler() legt eine benutzerdefinierte Fehlerbehandlungsfunktion fest.

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.

Syntax

set_error_handler(error_function,error_types)

Parameterbeschreibung

error_function Erforderlich. Gibt die Funktion an, die ausgeführt werden soll, wenn ein Fehler auftritt.
error_types optional. Gibt an, auf welcher Fehlerberichtsebene benutzerdefinierte Fehler angezeigt werden. Der Standardwert ist „E_ALL“.

Tipps und Hinweise

Tipp: Wenn diese Funktion verwendet wird, wird die standardmäßige PHP-Fehlerbehandlungsfunktion vollständig umgangen. Bei Bedarf muss der benutzerdefinierte Fehlerhandler beendet werden (die()). Skript.

Hinweis: Wenn ein Fehler auftritt, bevor das Skript ausgeführt wird, wird der benutzerdefinierte Fehlerhandler nicht verwendet, da das benutzerdefinierte Programm zu diesem Zeitpunkt noch nicht registriert wurde.

Beispiel

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

更多PHP中set error handler函数用法小结相关文章请关注PHP中文网!

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