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));
}
});
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.
Obwohl Register_Shutdown_Function leistungsstark ist, ist es nicht allmächtig. Die folgenden Arten von Fehlern oder Situationen sind nicht erfasst:
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.
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
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
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.
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
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.
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.
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.
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']));
}
}