Position actuelle: Accueil> Derniers articles> registre_shutdown_function Quelles erreurs ne peuvent pas être capturées? Analyse des malentendus communs

registre_shutdown_function Quelles erreurs ne peuvent pas être capturées? Analyse des malentendus communs

gitbox 2025-05-26

1. Brève description de registre_shutdown_function

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));
    }
});

2. Types d'erreurs qui peuvent être capturées

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 () .


3. Types et situations d'erreurs qui ne peuvent pas être capturées

Bien que registre_shutdown_function soit puissant, il n'est pas omnipotent. Les types d'erreurs ou de situations suivants ne sont pas cuits:

1. Erreurs non mortelles telles que E_NOTICE , E_WARNING

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.

2. Fonctions qui sortent de script tôt: exit () ou die ()

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

3. Erreur d'analyse à quelques étapes d'analyse

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

4. Le contenu du tampon de sortie qui n'a pas été achevé avant l'erreur mortelle se produit

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".

5. Caractère de suppression d'erreur @

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é

4. Analyse des malentendus communs

Misonctant 1: "La fonction d'arrêt peut attraper toutes les erreurs"

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é.

Misonctant 2: "Utilisez simplement une fonction d'arrêt est suffisante"

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.

Misonctant 3: "Aucune sortie signifie que la fonction d'arrêt ne fonctionne pas"

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.


5. Idées de gestion des erreurs correctes

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']));
    }
}