Aktueller Standort: Startseite> Neueste Artikel> Register_Shutdown_Function Welche Fehler können nicht gefangen werden? Analyse häufiger Missverständnisse

Register_Shutdown_Function Welche Fehler können nicht gefangen werden? Analyse häufiger Missverständnisse

gitbox 2025-05-26

1. Kurzbeschreibung von Register_Shutdown_Function

Die Rolle von Register_Shutdown_Function besteht darin, eine Rückruffunktion am Ende der PHP -Skriptausführung zu registrieren, die aufgerufen wird, wenn das Skript endet. Es wird häufig verwendet, um tödliche Fehler zu protokollieren, Ressourcen freizusetzen oder nach der Verarbeitung zu arbeiten.

 register_shutdown_function(function () {
    $error = error_get_last();
    if ($error !== null) {
        // Fehlerbehandlung Logik
        file_put_contents('/tmp/php_error.log', print_r($error, true));
    }
});

2. Arten von Fehlern, die erfasst werden können

Der Fehler, den Register_Shutdown_Function erfassen kann, ist normalerweise ein "tödlicher Fehler", der in error_get_last () aufgezeichnet wird, bevor das Skript endet. Häufige Arten von Fehlern, die gefangen werden können, sind:

  • E_Error : Fataler Fehler zur Laufzeit

  • E_PARSE : Parsing -Fehler (in einigen Fällen)

  • E_CORE_ERROR , E_COMPILE_ERROR : Fatal Fehler beim Starten von PHP

  • E_USER_ERROR : Ein von dem Benutzer definierter fataler Fehler

Diese Fehler verursachen normalerweise Skript -Interrupts. In diesem Fall hat die Herunterfahrenfunktion die Möglichkeit, Fehlerdetails über ERROR_GET_LAST () auszuführen und zu erfassen.


3. Typen und Situationen von Fehlern, die nicht erfasst werden können

Obwohl Register_Shutdown_Function leistungsstark ist, ist es nicht allmächtig. Die folgenden Arten von Fehlern oder Situationen sind nicht erfasst:

1. Nicht tödliche Fehler wie e_notice , e_warning

Nicht tödliche Fehler verursachen keine Skript-Interrupts. Daher wird keine Fehlerbehandlungslogik in Register_Shutdown_Function ausgelöst:

 echo $undefined_variable; // Bericht notice,Wirkt sich nicht aus der Ausführung aus

Obwohl die Abschaltfunktion aufgerufen wird, enthält der von ERROL_GET_LAST () zurückgegebene Inhalt diese nicht tödlichen Fehler nicht.

2. Funktionen, die das Skript früh beenden: exit () oder Die ()

Wenn das Skript aktiv über Exit oder Stirb beendet ist und vor dem Verlassen keinen tödlichen Fehler wirft, ist der Rückgabewert von error_get_last () null :

 exit("Verlassen Sie das Programm"); // auslösen shutdown,Aber keine Fehleraufzeichnungen

3.. Analyse der Fehler in einigen Parsingstadien

Einige Syntaxfehler treten während der PHP -Parsingphase auf, und das Skript gibt nicht einmal den Ausführungsprozess ein, was bedeutet, dass Register_Shutdown_Function keine Chance hat, sich zu registrieren:

 // Der folgende Code bewirkt direkt, dass die Parsen fehlschlägt,Registrierung nicht in der Lage shutdown Funktion
echo "Hello

V.

Obwohl es nicht "Fehler kann nicht gefangen werden", sollte beachtet werden, dass die Ausgabe der Seite möglicherweise verloren geht, wenn OB_Start () nicht aktiviert ist, da ein tödlicher Fehler auftritt, was zu keinen Fehleranforderungen führt. Diese Situation wird oft mit "Die Abschaltfunktion ist ungültig" verwechselt.

5. Fehlerunterdrückungszeichen @

Der Fehlersuppressor verhindert keine tödlichen Fehler, sondern unterdrückt die Anzeige nicht tödlicher Fehler, was leicht zu Verwirrung führen kann. Register_Shutdown_Function kann auch mit @ :

 @trigger_error("This is a user warning", E_USER_WARNING); // Wird nicht gefangen genommen

4. Analyse gemeinsamer Missverständnisse

Missverständnis 1: "Die Stilldown -Funktion kann alle Fehler aufnehmen"

Wie bereits erwähnt, kann Register_Shutdown_Function nur tödliche Fehler behandeln und kann nicht als allgemeiner Fehlerbehandlungsmechanismus verwendet werden. Für E_WARNING und E_NOTICE sollte set_error_handler verwendet werden.

Missverständnis 2: "Verwenden Sie einfach eine Abschaltfunktion ist genug"

Die Fehlerbehandlung sollte auf mehreren Ebenen verteidigt werden. Best Practice besteht darin, es in Kombination zu verwenden:

  • set_error_handler () erfasst nicht tödliche Fehler wie Warnungen und Benachrichtigungen;

  • set_exception_handler () fängt ungewöhnliche Ausnahmen auf;

  • Register_Shutdown_Function () erfasst den letzten Fehler vor dem Skript.

Missverständnis 3: "Keine Ausgabe bedeutet, dass die Abschaltfunktion nicht funktioniert."

Oft wird das Abschalten tatsächlich ausgeführt, aber weil ERROR_GET_LAST () NULL zurückgibt und nichts aufgezeichnet wird, glaubt der Entwickler fälschlicherweise, dass die Funktion nicht funktioniert.


5. Richtige Fehlerbehandlungsideen

Für ein umfassenderes Fehlerbehandlungssystem wird die folgende Kombination empfohlen:

 set_error_handler('customErrorHandler');
set_exception_handler('customExceptionHandler');
register_shutdown_function('shutdownHandler');

function customErrorHandler($errno, $errstr, $errfile, $errline) {
    // Aufzeichnen warning、notice Warten
}

function customExceptionHandler($exception) {
    // Aufzeichnen未捕获异常
}

function shutdownHandler() {
    $error = error_get_last();
    if ($error !== null && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        // 致命错误Aufzeichnen
        file_get_contents('https://gitbox.net/log.php?msg=' . urlencode($error['message']));
    }
}