Bitte geben Sie beim Nachdruck die Quelle an: Was müssen wir über die fehlerhaften Konfigurationen in PHP wissen? Zusammenfassung des Fehlermechanismus von PHP (nachgedruckt)
// Strenge Standards: In /tmp/php/index.php in Zeile 17 sollten nur Variablen als Referenz übergeben werden. Funktionsänderung (&$var) {
$var = 10;
}
$var = 1;
change( $var);// E_STRICT
E_RECOVERABLE_ERROR
Diese Ebene ist eigentlich die ERROR-Ebene, wird aber erwartet Erfasst werden. Wenn er nicht durch die Fehlerbehandlung erfasst wird, ist das Verhalten dasselbe wie bei E_ERROR.
Es kommt häufig vor, wenn der formale Parameter einen Typ definiert, aber beim Aufruf der falsche Typ übergeben wird. Seine Fehlererinnerung enthält außerdem das Wort Catachable vor dem schwerwiegenden Fehler von E_ERROR.
//Abfangbarer schwerwiegender Fehler: Argument 1, das an testCall() übergeben wird, muss eine Instanz von A sein, die Instanz von B muss angegeben, in /tmp/php/index.php in Zeile 37 aufgerufen und in /tmp/php/index definiert werden .php in Zeile 33class 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 gewartet werden.
Zum Beispiel verwendet CURLOPT_POSTFIELDS von Curl @FILENAME zum Hochladen von Dateien
// Veraltet: curl_setopt(): Die Verwendung der @filename-API zum Hochladen von Dateien ist veraltet. Bitte verwenden Sie stattdessen die Klasse CURLFile in /tmp/php /. index.php online 42$ch = curl_init("http://www.remotesite.com/upload.php");
curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'. " test"));
E_CORE_ERROR, E_CORE_WARNING
Diese beiden Fehler werden von der PHP-Engine generiert und treten während des PHP-Initialisierungsprozesses auf.
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 alle von Benutzern verursacht. Die Verwendung von trigger_error entspricht einer Lücke für Benutzer, um verschiedene Fehlertypen auszulösen. Dies ist eine gute Möglichkeit, Try-Catch-Ausnahmen zu umgehen.
trigger_error("Kann nicht durch Null dividieren", E_USER_ERROR);// E_USER_ERROR// E_USER_WARING// E_USER_NOTICE// E_USER_DEPRECATED
E_ALL
E_STRICT Alle Fehler- und Warnmeldungen werden ausgegeben.
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-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 die Konfigurationsdatei von PHP-FPM .php -fpm.conf.
Konfiguration in php.ini
error_reporting = E_ALL // Fehlerstufe melden, welche Stufe error_log = /tmp/php_errors.log // Speicherort der Fehleranzeige in PHP protokollieren display_errors = On // Ob Fehler angezeigt werden sollen Die Ausgabe, diese Ausgabe kann die Seite sein oder stdoutdisplay_startup_errors = On // Ob die Fehlerinformationen des Startvorgangs auf der Seite angezeigt werden sollen. Denken Sie daran, dass beim Start mehrere oben erwähnte Kerntypfehler auftreten Steuert, ob diese Fehler auf der Seite angezeigt werden. log_errors = On // Ob Fehlerprotokolle aufgezeichnet werden log_errors_max_len = 1024 // Maximale Länge des Fehlerprotokollsignore_repeated_errors = Off // Ob wiederholte Fehler ignoriert werden sollen track_errors = Off // Ob die globale Variable $php_errormsg zum Aufzeichnen des letzten Fehlers verwendet werden soll xmlrpc_errors = 0 //Ob das XML-RPC-Fehlermeldungsformat zum Aufzeichnen von Fehlern verwendet werden soll xmlrpc_error_number = 0 // Wird als Wert des XML-RPC-FaultCode-Elements verwendet. html_errors = On // Ob die Funktionen und andere Informationen in der Ausgabe in HTML-Links umgewandelt werden sollen docref_root = http://manual/en/ // Wenn html_errors aktiviert ist, was ist der Stammpfad dieses Links fastcgi.logging = 0 // Ob PHP-Fehler in fastcgi geworfen werden sollen
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. Das Tag
ignore_repeated_errors 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: Undefinierte Variable: c in /tmp/php/index.php in Zeile 20
NOTICE wäre zweimal erschienen, aber jetzt wird es nur noch einmal erscheinen...
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 die von uns zurückgegebene Fehlermeldung nach der Konfiguration dieser beiden Parameter einige Informationen im Dokument enthält, wird sie 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
Auf der Seite wird Folgendes angezeigt:
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 // eigenes Protokoll von php-fpm log_level = note // Protokollierung von php-fpms eigenem Protokoll level php_flag[display_errors] = off // Eine Konfigurationsvariable in php.ini überschreiben, die durch ini_set im Programm überschrieben werden kann php_value[display_errors] = off // Gleich wie php_flagphp_admin_value[error_log] = /tmp/www-error.log // Eine Konfigurationsvariable in php.ini überschreiben und nicht durch ini_set im Programm überschrieben werden. php_admin_flag[log_errors] = on // Gleich wie php_admin_valuecatch_workers_output = yes // Ob die Ausgabe von fpmworker erfasst werden soll request_slowlog_timeout = 0 // Langsame Protokolldauer slowlog = /var/log/php-fpm/www-slow.log // Langsame Protokollierung
Es gibt auch eine error_log-Konfiguration in der php-fpm-Konfiguration, die oft mit der error_log-Konfiguration in php.ini verwechselt wird. 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 Fehlerprotokoll 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
Diese vier Die beiden Funktionen des Funktionsadministrators geben an, dass ini_set nicht verwendet werden kann, um die Variable im Code neu zuzuweisen, nachdem diese Variable festgelegt wurde. 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 Dauer 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.