Heim > Artikel > Backend-Entwicklung > Zusammenfassung der Fehlermechanismen für die PHP5.5.32-Version
Fehlerstufen von PHP
Zunächst müssen Sie verstehen, welche Fehler es in PHP gibt. Ab php5.5 gibt es insgesamt 16 Fehlerstufen
Hinweis: Bitte stellen Sie sicher, dass error_log aktiviert ist, wenn Sie den folgenden Code ausprobieren:
error_reporting(E_ALL); ini_set('display_errors', 'On');
E_ERROR
Dieser Fehler ist ein schwerwiegender Fehler und wird auf der Seite als „Schwerwiegender Fehler“ angezeigt. Wenn dieser Fehler auftritt, kann das Programm nicht weiter ausgeführt werden
Fehlerbeispiel:
// Fatal error: Call to undefined function hpinfo() in /tmp/php/index.php on line 5 hpinfo(); //E_ERROR
Beachten Sie, dass bei einer nicht abgefangenen Ausnahme auch diese Ebene ausgelöst wird.
// Fatal error: Uncaught exception 'Exception' with message 'test exception' in /tmp/php/index.php:5 Stack trace: #0 {main} thrown in /tmp/php/index.php on line 5 throw new \Exception("test exception");
Dieser Fehler ist nur eine Warnung, das Skript wird nicht beendet, das Programm wird fortgesetzt und die angezeigte Fehlermeldung ist Warnung. Fügen Sie beispielsweise eine Datei ein, die nicht vorhanden ist.
//Warning: include(a.php): failed to open stream: No such file or directory in /tmp/php/index.php on line 7 //Warning: include(): Failed opening 'a.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php') in /tmp/php/index.php on line 7 include("a.php"); //E_WARNING
E_NOTICE
Dieser Fehler ist eher geringfügig und erinnert Sie daran, dass dies nicht an dieser Stelle geschrieben werden sollte. Auch hier handelt es sich um einen Laufzeitfehler. Der falsche Code hat womöglich keine Probleme, sondern nur im aktuellen Kontext.
Zum Beispiel existiert die Variable $b nicht, wir weisen sie einer anderen Variablen zu
//Notice: Undefined variable: b in /tmp/php/index.php on line 9 $a = $b; //E_NOTICE
E_PARSE
Dieser Fehler tritt während der Kompilierung auf , wird beim Kompilieren ein Syntaxfehler festgestellt und die Syntaxanalyse kann nicht durchgeführt werden.
Zum Beispiel ist z unten nicht als Variable festgelegt.
// Parse error: syntax error, unexpected '=' in /tmp/php/index.php on line 20 z=1; // E_PARSE
E_STRICT
Dieser Fehler wurde nach PHP5 eingeführt. Ihr Code kann ausgeführt werden, aber es ist nicht die Art und Weise, wie PHP ihn schreibt.
Zum Beispiel die Übergabe des ++-Symbols in einem Funktionsparameter
// Strict Standards: Only variables should be passed by reference in /tmp/php/index.php on line 17 function change (&$var) { $var += 10; } $var = 1; change(++$var); // E_STRICT
E_RECOVERABLE_ERROR
Diese Ebene ist eigentlich die ERROR-Ebene, aber es Es wird erwartet, dass er erfasst wird. Wenn er nicht durch die Fehlerbehandlung erfasst wird, ist das Verhalten dasselbe wie bei E_ERROR.
tritt häufig auf, wenn der formale Parameter einen Typ definiert, beim Aufruf jedoch der falsche Typ übergeben wird. Seine Fehlererinnerung enthält außerdem das Wort Catachable vor dem schwerwiegenden Fehler von E_ERROR.
//Catchable fatal error: Argument 1 passed to testCall() must be an instance of A, instance of B given, called in /tmp/php/index.php on line 37 and defined in /tmp/php/index.php on line 33 class A { } class B { } function testCall(A $a) { } $b = new B(); testCall($b);
E_DEPRECATED
Dieser Fehler bedeutet, dass Sie eine alte Version der Funktion verwenden und spätere Versionen dieser Funktion möglicherweise deaktiviert sind oder nicht gepflegt.
Zum Beispiel verwendet CURLOPT_POSTFIELDS von Curl @FILENAME zum Hochladen von Dateien
// Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in /tmp/php/index.php on line 42 $ch = curl_init("http://www.php.cn/upload.php"); curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'. "test"));
E_CORE_ERROR, E_CORE_WARNING
Diese beiden Fehler werden durch PHP verursacht der Engine und erfolgt während der PHP-Initialisierung.
E_COMPILE_ERROR, E_COMPILE_WARNING
Diese beiden Fehler werden von der PHP-Engine generiert und treten während des Kompilierungsprozesses auf.
E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED,
Diese Fehler werden von Benutzern gemacht, was einer Lücke entspricht, die verschiedene Fehler für Benutzer auslöst. Dies ist eine gute Möglichkeit, Try-Catch-Ausnahmen zu umgehen.
trigger_error("Cannot divide by zero", E_USER_ERROR); // E_USER_ERROR // E_USER_WARING // E_USER_NOTICE // E_USER_DEPRECATED
E_ALL
E_STRICT alle Fehler- und Warnmeldungen.
Fehlerkontrolle
Es gibt viele Konfigurationen und Parameter in PHP, die Fehler und die Anzeige von Fehlerprotokollen steuern können. Im ersten Schritt müssen wir wissen, was die falschen Konfigurationen in PHP sind.
Gemäß dem PHP + PHP-FPM-Modell gibt es tatsächlich zwei Konfigurationsdateien, die sich auf die Anzeige von PHP-Fehlern auswirken. Eine davon ist die Konfigurationsdatei php.ini von PHP selbst und die andere ist PHP-FPM . Konfigurationsdatei, php-fpm.conf.
Konfiguration in php.ini
error_reporting = E_ALL // 报告错误级别,什么级别的 error_log = /tmp/php_errors.log // php中的错误显示的日志位置 display_errors = On // 是否把错误展示在输出上,这个输出可能是页面,也可能是stdout display_startup_errors = On // 是否把启动过程的错误信息显示在页面上,记得上面说的有几个Core类型的错误是启动时候发生的,这个就是控制这些错误是否显示页面的。 log_errors = On // 是否要记录错误日志 log_errors_max_len = 1024 // 错误日志的最大长度 ignore_repeated_errors = Off // 是否忽略重复的错误 track_errors = Off // 是否使用全局变量$php_errormsg来记录最后一个错误 xmlrpc_errors = 0 //是否使用XML-RPC的错误信息格式记录错误 xmlrpc_error_number = 0 // 用作 XML-RPC faultCode 元素的值。 html_errors = On // 是否把输出中的函数等信息变为HTML链接 docref_root = http://manual/en/ // 如果html_errors开启了,这个链接的根路径是什么 fastcgi.logging = 0 // 是否把php错误抛出到fastcgi中
Wir werden oft gefragt, was der Unterschied zwischen error_reporting und display_errors ist? Diese beiden Funktionen sind völlig unterschiedlich.
PHP protokolliert standardmäßig die Standardausgabe (im FPM-Modus ist die Standardausgabe die Seite)
Der Parameter von error_reporting ist die Fehlerstufe. Gibt an, welche Ebene einen Fehler auslösen soll. Wenn wir PHP mitteilen, dass nicht alle Fehlerstufen Fehler auslösen müssen, wird dieser Fehler weder im Protokoll noch auf der Seite angezeigt, was bedeutet, dass nichts passiert.
display_errors steuert, ob Fehlermeldungen in der Standardausgabe angezeigt werden sollen.
log_errors steuert, ob Fehlermeldungen im Protokoll aufgezeichnet werden sollen.
error_log ist der Ort, an dem das Fehlerprotokoll angezeigt wird. Dieses wird häufig in php-fpm umgeschrieben, sodass häufig festgestellt wird, dass sich die Fehlerprotokolle von cli und fpm nicht in derselben Datei befinden.
ignore_repeated_errors Dieses Tag steuert, dass bei doppelten Protokollen nur eines aufgezeichnet wird, wie zum Beispiel das folgende Programm:
error_reporting(E_ALL); ini_set('ignore_repeated_errors', 1); ini_set('ignore_repeated_source', 1); $a = $c; $a = $c; //E_NOTICE //Notice: Undefined variable: c in /tmp/php/index.php on line 20
NOTICE wäre zweimal erschienen, aber jetzt wird es so sein erscheint nur einmal...
Durch die Aktivierung von „track_errors“ werden die letzten Fehlerinformationen in der Variablen gespeichert. Dies kann beim Aufzeichnen von Protokollen von Nutzen sein. Aber ich denke, es ist wirklich nutzlos...
html_errors und docref_root sind sehr benutzerfreundliche Konfigurationen. Wenn nach der Konfiguration dieser beiden Parameter einige Informationen im Dokument in der von uns zurückgegebenen Fehlermeldung enthalten sind, werden diese zu einem Link.
error_reporting(E_ALL); ini_set('html_errors', 1); ini_set('docref_root', "https://secure.php.net/manual/zh/"); include("a2.php"); //E_WARNING
ermöglicht es Ihnen, schnell herauszufinden, wo wir Fehler gemacht haben. Ist das nicht sehr menschlich?
Konfiguration in PHP-FPM
error_log = /var/log/php-fpm/error.log // php-fpm自身的日志 log_level = notice // php-fpm自身的日志记录级别 php_flag[display_errors] = off // 覆盖php.ini中的某个配置变量,可被程序中的ini_set覆盖 php_value[display_errors] = off // 同php_flag php_admin_value[error_log] = /tmp/www-error.log // 覆盖php.ini中的某个配置变量,不可被程序中的ini_set覆盖 php_admin_flag[log_errors] = on // 同php_admin_value catch_workers_output = yes // 是否抓取fpmworker的输出 request_slowlog_timeout = 0 // 慢日志时长 slowlog = /var/log/php-fpm/www-slow.log // 慢日志记录
Es gibt auch eine error_log-Konfiguration in der Konfiguration von PHP-FPM, was häufig der Fall ist mit PHP verbunden. Die error_log-Konfiguration in ini ist verwirrend. Die Dinge, die sie aufzeichnen, sind jedoch unterschiedlich. Das Fehlerprotokoll von PHP-FPM zeichnet nur die Protokolle von PHP-FPM selbst auf, z. B. das Starten und Herunterfahren von FPM.
Das error_log in php.ini ist das Fehlerprotokoll, das das PHP-Programm selbst aufzeichnet.
Um also die error_log-Konfiguration in php.ini in php-fpm zu überschreiben, müssen Sie die folgenden Funktionen verwenden:
php_flag
php_value
php_admin_flag
php_admin_value
Zwei dieser vier Funktionen admin Funktionsbeschreibung Danach Wenn die Variable festgelegt ist, können Sie ini_set nicht verwenden, um die Variable im Code neu zuzuweisen. Das php_flag/value basiert immer noch auf dem ini_set im PHP-Code.
Slowlog wird von fpm aufgezeichnet. Sie können die Einstellung „request_slowlog_timeout“ verwenden, um die Länge des langsamen Protokolls zu bestimmen.
Zusammenfassung
Was wir oft verwechseln, ist das Protokollproblem und warum bestimmte Protokollebenen nicht im Protokoll aufgezeichnet werden. Das Wichtigste ist, sich die drei Konfigurationen error_log, display_errors und log_errors anzusehen. Bei der Betrachtung der Konfiguration müssen wir jedoch auch darauf achten, zwischen der Konfiguration in php.ini und der Konfiguration in php zu unterscheiden. fpm.ini.