Heim  >  Artikel  >  Backend-Entwicklung  >  So lösen Sie das PHP 500-Fehlerproblem

So lösen Sie das PHP 500-Fehlerproblem

藏色散人
藏色散人Original
2021-12-29 09:30:2912508Durchsuche

Lösung für den PHP-500-Fehler: 1. Überprüfen Sie das PHP-Skript und ändern Sie es. 2. Erfassen Sie die Ausnahme und zeichnen Sie die Ausnahme im Protokoll auf. 3. Analysieren Sie das Protokoll und verarbeiten Sie es.

So lösen Sie das PHP 500-Fehlerproblem

Die Betriebsumgebung dieses Artikels: Windows 7-System, PHP Version 7.1, Dell G3-Computer.

Wie löse ich das PHP-500-Fehlerproblem?

PHP- und 500-Fehler

Während des PHP-Entwicklungsprozesses werden häufig 500-Fehler zurückgegeben und es gibt keinen Debugging-Inhalt (verfügbar) im Hauptteil. Zu diesem Zeitpunkt müssen Sie langsam debuggen (Punkte unterbrechen, Debug-Modus aktivieren usw.). Wenn es sich jedoch um ein Live-Netzwerk handelt, ist dieser Fehler frustrierender. Es ist weder einfach, Punkte zu unterbrechen noch den Debug-Modus zu aktivieren. Aber da es sich um einen Fehler handelt, gibt es immer eine Lösung. Lassen Sie uns die Ursachen und Lösungen von 500 Schritt für Schritt analysieren.

0x01, 500 Fehler

500 Fehler, auch Internal Server Error (interner Dienstfehler) genannt, bedeutet, dass der Dienst die Anfrage aufgrund eines unbekannten Fehlers nicht verarbeiten kann. In PHP-Sites wird es im Allgemeinen von PHP zurückgegeben. Mit anderen Worten, 500-Fehler sind im Allgemeinen Fehler in PHP-Skripten.

So lösen Sie das PHP 500-Fehlerproblem

php-fpm-Erfassungspaket 500

Wie Sie auf dem obigen Bild (Nginx+PHP-FPM-Architektur) sehen können, gibt das Skript einen Fehler aus, wenn PHP eine nicht vorhandene Klasse aufruft und 500 an Nginx zurückgibt (und wird). Die Fehlermeldung wird ebenfalls zurückgegeben, aber in STDERR entladen.

0x02, welche Fehlerausnahmen verursachen 500

Welche Fehler verursachen also 500-Fehler? Alle Fehlerstufen von PHP finden Sie in der offiziellen Dokumentation von PHP (http://php.net/manual/zh/errorfunc .constants.php) und die Fehlerstufen E_ERROR, E_PARSE, E_RECOVERABLE_ERROR, E_USER_ERROR und nicht abgefangene Ausnahmen verursachen alle 500 Fehler. Fehler auf E_ERROR-Ebene, verursacht durch 500 Ausnahme im PHP-Skript, wird es definitiv 500 verursachen? Offensichtlich nicht, selbst wenn das Skript einen schwerwiegenden Fehler aufweist, kann es dennoch 200 zurückgeben.

So lösen Sie das PHP 500-Fehlerproblem

Konfigurationsoption „display_errors“

In Webanwendungen, die auf Python, NodeJS usw. basieren, wird standardmäßig eine Ausnahmemeldung auf der Konsole ausgegeben (STDERR/STDOUT). In PHP, das auf der PHP-FPM-Architektur basiert, gibt es keine Konsole zum Drucken, und stderr und stdout sind in FastCGI auf die entsprechenden STRDERR und STDOUT gesetzt. Wenn der Fehler an STDOUT umgeleitet wird, wird der Fehler direkt in der Antwort ausgegeben und der Statuscode wird auf 200 gesetzt. Dies ist auch die Fähigkeit, die durch die Option display_errors erreicht wird. Die Konfiguration der display_errors-Option muss über ini_set implementiert werden. Die Konfiguration von display_errors im PHP-Dokument gibt an, dass der Wert ein String-Typ ist. Bei der tatsächlichen Verwendung können Zahlen und boolesche Typen diese Konfiguration auch aktivieren oder deaktivieren.

So lösen Sie das PHP 500-Fehlerproblemerror_reporting-Konfiguration

display_errors steuert, ob Fehlerdetails angezeigt werden und ob Fehlerstatuscodes zurückgegeben werden, wenn ein Fehler im PHP-Skript auftritt, während das Element error_reporting verwendet wird, um zu steuern, welche Fehlerstufe direkt gedruckt werden kann.

Die Einstellungselemente von error_reporting können über error_reporting(E_ALL) oder ini_set('error_reporting', E_ALL) konfiguriert werden. Einzelheiten zu den Funktionsparametern finden Sie in der PHP-Dokumentation.

Es ist zu beachten, dass PHP selbst über Fehlerprotokolle verfügt (zwei Konfigurationselemente, error_log und log_errors). Wenn ein Fehler auftritt, wird PHP den Fehler in das Fehlerprotokoll schreiben. Welche Fehler geschrieben werden müssen, wird durch das Element „error_reporting“ beeinflusst. der Kontrolle. Wenn die Fehlerstufe nicht übereinstimmt, werden keine Fehlerdetails angezeigt Alles, was Sie zu diesem Zeitpunkt tun können, ist die Erfassung von Ausnahmen, die erkannt und im Protokoll aufgezeichnet werden, um zukünftiges Debuggen und die Behandlung von Live-Netzwerkfehlern zu erleichtern.

So lösen Sie das PHP 500-Fehlerproblem

PHP wird mit Fehlerprotokoll geliefert

PHP selbst verfügt bereits über Fehlerprotokolleinträge. Sie können das Element „log_errors“ in php.ini auf „Ein“ setzen und mit dem Konfigurationselement „error_log“ zusammenarbeiten, um den Speicherpfad des Fehlerprotokolls anzugeben .

So lösen Sie das PHP 500-Fehlerproblem

Fehlerprotokollierungsschalter

So lösen Sie das PHP 500-Fehlerproblem

Protokollpfadeinstellung

Das Schreiben dieses Fehlerprotokolls wird nicht durch die Konfiguration von display_errors gesteuert. Das heißt, unabhängig davon, ob display_errors aktiviert ist oder nicht, werden Fehler im Protokoll aufgezeichnet. Dies wird jedoch durch die error_reporting-Konfiguration gesteuert. Wenn die aktuelle Fehlerstufe nicht mit der Fehlerstufe in error_reporting übereinstimmt, wird der Fehler nicht in das Protokoll geschrieben. Das heißt, wenn die Fehlerstufe E_ERROR ist, die Einstellung jedoch error_reporting(E_NOTICE) ist, wird die Fehlermeldung E_ERROR nicht im Protokoll angezeigt.

So lösen Sie das PHP 500-Fehlerproblem

Das PHP-Fehlerprotokoll zeichnet verschiedene Arten von Fehlern auf.

So lösen Sie das PHP 500-Fehlerproblem

Das Protokoll wird aufgrund einer Nichtübereinstimmung der Fehlerebene nicht geschrieben Handhabungsfunktion. Die Fehleraufzeichnung kann erreicht werden, indem die erfassten Fehlerinformationen über eine Funktion in das angegebene Protokoll geschrieben werden. Einzelheiten zur Verwendung der

-Funktion finden Sie unter http://km.oa.com/group/19368/articles/show/302491. Hier ist eine Vorlage:

$previousHandler = set_exception_handler(function(Exception $ex) use (&$previousHandler) {
    call_user_func('exceptionHandler', $ex, $previousHandler);
});
set_error_handler('errorHandler');
register_shutdown_function('fatalErrorHandler');
function exceptionHandler(Exception $ex, $previousHandler)
{
    $info = array(
        $ex->getFile(),
        $ex->getLine(),
        $ex->getCode(),
        $ex->getMessage()
    );
    // 记录日志
    logPHPError($info);
    if (isset($previousHandler) && is_callable($previousHandler)) {
        call_user_func($previousHandler, $ex);
    }
}
/**
 * 框架错误处理函数
 * @param $errno
 * @param $errstr
 * @param $errfile
 * @param $errline
 * @return bool
 */
function errorHandler($errno = 0, $errstr = '', $errfile = '', $errline = 0)
{
    switch ($errno) {
        case E_WARNING:
            $errname = 'E_WARNING';
            break;
        case E_NOTICE:
            $errname = 'E_NOTICE';
            break;
        case E_STRICT:
            $errname = 'E_STRICT';
            break;
        case E_RECOVERABLE_ERROR:
            $errname = 'E_RECOVERABLE_ERROR';
            break;
        case E_DEPRECATED:
            $errname = 'E_DEPRECATED';
            break;
        case E_USER_ERROR:
            $errname = 'E_USER_ERROR';
            break;
        case E_USER_WARNING:
            $errname = 'E_USER_WARNING';
            break;
        case E_USER_NOTICE:
            $errname = 'E_USER_NOTICE';
            break;
        case E_USER_DEPRECATED:
            $errname = 'E_USER_DEPRECATED';
            break;
        default:
            restore_error_handler();
            return false;
    }
    // 记录日志
    $info = array(
        $errfile,
        $errline,
        $errname,
        $errstr
    );
    logPHPError($info);
    restore_error_handler();
    return false;
}
/**
 * Fatal error错误处理
 */
function fatalErrorHandler()
{
    if (($e = error_get_last()) && $e['type'] === E_ERROR) {
        $info = array(
            $e['file'],
            $e['line'],
            'E_ERROR',
            $e['message']
        );
        // 记录日志
        logPHPError($info);
    }
}

0x05 Zusammenfassung

Zur Zusammenfassung up, error_reporting wird verwendet, um Funktionen oder Konfigurationen zu steuern, die Fehlerinformationsebenen an den Browser oder das PHP-Fehlerprotokoll ausgeben, und display_errors steuert, ob Fehler- und Warninformationen an den Browser ausgegeben werden. Da das Fehlerprotokoll von PHP global ist und von error_reporting gesteuert wird, wird empfohlen, eine eigene Fehler-(Ausnahme-)Erfassungs- und Aufzeichnungslogik in Ihrem Unternehmen zu implementieren.

Empfohlenes Lernen: „

PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo lösen Sie das PHP 500-Fehlerproblem. 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