Le rôle de registre_shutdown_function est d'enregistrer une fonction de rappel à la fin de l'exécution du script PHP, qui est appelée lorsque le script se termine. Il est souvent utilisé pour enregistrer les erreurs mortelles, libérer des ressources ou faire des travaux de post-traitement.
register_shutdown_function(function () {
$error = error_get_last();
if ($error !== null) {
// Logique de gestion des erreurs
file_put_contents('/tmp/php_error.log', print_r($error, true));
}
});
L'erreur que registre_shutdown_function peut attraper est généralement une "erreur fatale" enregistrée dans error_get_last () avant que le script ne se termine. Les types d'erreurs courants qui peuvent être capturés comprennent:
E_ERROR : Erreur fatale au moment de l'exécution
E_Parse : erreur d'analyse (dans certains cas)
E_core_error , e_compile_error : erreur fatale lorsque php démarre
E_user_error : une erreur fatale définie par l'utilisateur
Ces erreurs provoquent généralement des interruptions de script, auquel cas la fonction d'arrêt a une chance d'exécuter et de capturer les détails d'erreur via Error_get_last () .
Bien que registre_shutdown_function soit puissant, il n'est pas omnipotent. Les types d'erreurs ou de situations suivants ne sont pas cuits:
Les erreurs non mortelles ne provoquent pas d'interruptions de script, donc la logique de gestion des erreurs dans registre_shutdown_function n'est pas déclenchée:
echo $undefined_variable; // Rapport notice,N'affecte pas l'exécution
Bien que la fonction d'arrêt soit appelée, le contenu renvoyé par error_get_last () ne contiendra pas ces erreurs non mortelles.
Si le script sort activement via la sortie ou la mort et ne lance pas d'erreur fatale avant de quitter, alors la valeur de retour d' erreur_get_last () est nul :
exit("Quitter le programme"); // déclenchement shutdown,Mais aucun enregistrement d'erreur
Certaines erreurs de syntaxe se produisent pendant la phase d'analyse PHP, et le script ne saisit même pas le processus d'exécution, ce qui signifie que registre_shutdown_function n'a aucune chance de s'inscrire:
// Le code suivant fait échouer l'analyse directement,Impossible de s'inscrire shutdown fonction
echo "Hello
Bien qu'il ne soit pas "l'erreur ne peut pas être capturée", il convient de noter que si ob_start () n'est pas activé avant qu'une erreur fatale ne se produise, la sortie de la page peut être perdue, ce qui n'aura pas d'invites d'erreur. Cette situation est souvent confondue avec "la fonction d'arrêt n'est pas valide".
Le suppresseur d'erreur n'empêchera pas les erreurs mortelles, mais supprimera l'affichage des erreurs non mortelles, ce qui peut facilement provoquer une confusion. registre_shutdown_function peut capter des erreurs fatales même avec @ :
@trigger_error("This is a user warning", E_USER_WARNING); // Ne sera pas capturé
Comme mentionné précédemment, registre_shutdown_function ne peut gérer que les erreurs mortelles et ne peut pas être utilisée comme mécanisme général de gestion des erreurs. Pour E_Warning et E_NOTICE , SET_ERROR_HANDLER doit être utilisé.
La gestion des erreurs doit être défendue à plusieurs niveaux. La meilleure pratique consiste à l'utiliser en combinaison:
set_error_handler () capture des erreurs non mortelles telles que les avertissements et les notifications;
set_exception_handler () attrape des exceptions non revues;
registre_shutdown_function () capture la dernière erreur avant que le script ne se termine.
Plusieurs fois, l'arrêt est en effet exécuté, mais parce que error_get_last () renvoie NULL et rien n'est enregistré, le développeur pense à tort que la fonction ne fonctionne pas.
Pour un système de gestion des erreurs plus complet, la combinaison suivante est recommandée:
set_error_handler('customErrorHandler');
set_exception_handler('customExceptionHandler');
register_shutdown_function('shutdownHandler');
function customErrorHandler($errno, $errstr, $errfile, $errline) {
// Enregistrer warning、notice attendez
}
function customExceptionHandler($exception) {
// Enregistrer未捕获异常
}
function shutdownHandler() {
$error = error_get_last();
if ($error !== null && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
// 致命错误Enregistrer
file_get_contents('https://gitbox.net/log.php?msg=' . urlencode($error['message']));
}
}