Je peux utiliser set_error_handler()
pour attraper la plupart des erreurs PHP, mais cela ne fonctionne pas pour les E_ERROR
erreurs fatales ( ), telles que l'appel d'une fonction qui n'existe pas. Existe-t-il un autre moyen de détecter ces erreurs?
J'essaie d'appeler mail()
pour toutes les erreurs et j'exécute PHP 5.2.3.
php
fatal-error
trop de php
la source
la source
Réponses:
Consigner les erreurs fatales en utilisant le
register_shutdown_function
, qui nécessite PHP 5.2+:Vous devrez définir les fonctions
error_mail
etformat_error
. Par exemple:Utilisez Swift Mailer pour écrire la
error_mail
fonction.Voir également:
la source
mail("[email protected]", "My Site: FATAL ERROR", "Details: " . $errno . ' ' . $errstr . ' ' . $errfile . ' ' . $errline);
Je viens de proposer cette solution (PHP 5.2.0+):
Différents types d'erreur sont définis dans Constantes prédéfinies .
la source
If an error handler (see set_error_handler ) successfully handles an error then that error will not be reported by this function.
"register_shutdown_function()
doit être antérieur à toute erreur fatale.use_1T_memory(); /* memory exhausted error here! */ register_shutdown_function('shutDownFunction');
ne fonctionnera pas comme prévu.PHP ne fournit pas de moyens conventionnels pour détecter et récupérer des erreurs fatales. En effet, le traitement ne doit généralement pas être récupéré après une erreur fatale. Une chaîne correspondant à un tampon de sortie (comme suggéré par le post original, la technique décrite sur PHP.net) est définitivement mal avisée. Ce n'est tout simplement pas fiable.
L'appel de la fonction mail () à partir d'une méthode de gestion d'erreurs s'avère également problématique. Si vous aviez beaucoup d'erreurs, votre serveur de messagerie serait chargé de travail et vous pourriez vous retrouver avec une boîte de réception noueuse. Pour éviter cela, vous pouvez envisager d'exécuter un cron pour analyser régulièrement les journaux d'erreurs et envoyer des notifications en conséquence. Vous voudrez peut-être également examiner les logiciels de surveillance du système, tels que Nagios .
Pour parler un peu de l'enregistrement d'une fonction d'arrêt:
Il est vrai que vous pouvez enregistrer une fonction d'arrêt, et c'est une bonne réponse.
Le point ici est que nous ne devrions généralement pas essayer de récupérer des erreurs fatales, surtout pas en utilisant une expression régulière contre votre tampon de sortie. Je répondais à la réponse acceptée , qui était liée à une suggestion sur php.net qui a depuis été modifiée ou supprimée.
Cette suggestion était d'utiliser une expression régulière contre le tampon de sortie lors de la gestion des exceptions, et dans le cas d'une erreur fatale (détectée par la correspondance avec le texte d'erreur configuré que vous attendez), essayez de faire une sorte de récupération ou de traitement continu. Ce ne serait pas une pratique recommandée (je crois que c'est pourquoi je ne trouve pas la suggestion originale aussi. Je l'ignore ou la communauté php l'a abattue).
Il convient de noter que les versions les plus récentes de PHP (environ 5.1) semblent appeler la fonction d'arrêt plus tôt, avant que le rappel de la mise en mémoire tampon de sortie ne soit invoqué. Dans la version 5 et les versions antérieures, cet ordre était l'inverse (le rappel de mise en mémoire tampon de sortie était suivi de la fonction d'arrêt). De plus, depuis environ 5.0.5 (qui est beaucoup plus tôt que la version 5.2.3 de l'interrogateur), les objets sont déchargés bien avant l'appel d'une fonction d'arrêt enregistrée, vous ne pourrez donc pas compter sur vos objets en mémoire pour le faire. beaucoup de tout.
L'enregistrement d'une fonction d'arrêt est donc correct, mais le type de tâches qui devraient être effectuées par une fonction d'arrêt est probablement limité à une poignée de procédures d'arrêt en douceur.
La clé à retenir ici n'est que quelques mots de sagesse pour quiconque bute sur cette question et voit les conseils dans la réponse initialement acceptée. Ne pas regex votre tampon de sortie.
la source
Eh bien, il semble possible d'attraper des erreurs fatales d'une autre manière :)
la source
Les erreurs fatales ou des erreurs fatales récupérables jettent maintenant les instances de
Error
en PHP 7 ou versions supérieures . Comme toutes les autres exceptions, lesError
objets peuvent être interceptés à l'aide d'untry/catch
bloc.Exemple:
https://3v4l.org/67vbk
Ou vous pouvez utiliser l'
Throwable
interface pour intercepter toutes les exceptions.Exemple:
https://3v4l.org/Br0MG
Pour plus d'informations: http://php.net/manual/en/language.errors.php7.php
la source
Fatal error: Trait 'FailedTrait' not found in
lors de l'utilisationReflectionClass
?include "filename.php"
place dans letry
bloc, puisThrowable
attraper le bloc fonctionne au moins pourParseError
.J'ai développé un moyen d'attraper tous les types d'erreur en PHP (presque tous)! Je n'ai aucune certitude sur E_CORE_ERROR (je pense que cela ne fonctionnera pas uniquement pour cette erreur)! Mais, pour d'autres erreurs fatales (E_ERROR, E_PARSE, E_COMPILE ...) fonctionne très bien en utilisant une seule fonction de gestion d'erreur! Voilà ma solution:
Mettez ce code suivant sur votre fichier principal (index.php):
la source
Vous ne pouvez pas attraper / gérer les erreurs fatales, mais vous pouvez les enregistrer / signaler. Pour un débogage rapide, j'ai modifié une réponse à ce code simple
la source
Vous ne pouvez pas lancer d'exception dans une fonction d'arrêt enregistrée comme celle-ci:
Mais vous pouvez capturer et rediriger la demande vers une autre page.
la source
Si vous utilisez PHP> = 5.1.0 Faites simplement quelque chose comme ça avec la classe ErrorException:
la source
Belle solution trouvée dans Zend Framework 2:
Cette classe vous permet de démarrer le spécifique
ErrorHandler
parfois si vous en avez besoin. Et puis, vous pouvez également arrêter le gestionnaire.Utilisez cette classe par exemple comme ceci:
Lien vers le code complet de classe:
https://github.com/zendframework/zf2/blob/master/library/Zend/Stdlib/ErrorHandler.php
Une solution peut-être meilleure est celle de Monolog :
Lien vers le code complet de la classe:https://github.com/Seldaek/monolog/blob/master/src/Monolog/ErrorHandler.php
Il peut également gérer FATAL_ERRORS à l'aide de la
register_shutdown_function
fonction. Selon cette classe, FATAL_ERROR est l'un des suivantsarray(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR)
.la source
J'ai besoin de gérer les erreurs fatales pour la production afin d'afficher à la place une sortie HTML 503 de style statique non disponible . C'est sûrement une approche raisonnable pour "détecter les erreurs fatales". Voici ce que j'ai fait:
J'ai une fonction personnalisée de gestion des erreurs "error_handler" qui affichera ma page HTML "503 service non disponible" sur n'importe quelle E_ERROR, E_USER_ERROR, etc.
dans ma fonction personnalisée error_handler, si l'erreur est E_ERROR, E_USER_ERROR, etc. J'appelle également
@ob_end_clean();
pour vider le tampon, supprimant ainsi le message "erreur fatale" de PHP.Prenez note des fonctions strictes de vérification et de désactivation de isset ()
@
car nous ne voulons pas que nos scripts error_handler génèrent des erreurs.En étant toujours d'accord avec keparo, la capture d'erreurs fatales va à l'encontre du but de "l'erreur fatale", donc il n'est pas vraiment destiné à vous de poursuivre le traitement. N'exécutez aucune fonction mail () dans ce processus d'arrêt car vous sauvegarderez certainement le serveur de messagerie ou votre boîte de réception. Consignez plutôt ces occurrences dans un fichier et planifiez un travail cron pour trouver ces fichiers error.log et les envoyer par courrier aux administrateurs.
la source
PHP a des erreurs fatales capturables. Ils sont définis comme E_RECOVERABLE_ERROR. Le manuel PHP décrit un E_RECOVERABLE_ERROR comme:
Vous pouvez "intercepter" ces erreurs "fatales" en utilisant set_error_handler () et en recherchant E_RECOVERABLE_ERROR. Je trouve utile de lever une exception lorsque cette erreur est détectée, vous pouvez alors utiliser try / catch.
Cette question et réponse fournit un exemple utile: Comment puis-je détecter une "erreur fatale capturable" sur les indications de type PHP?
Cependant, les erreurs E_ERROR peuvent être gérées, mais pas récupérées car le moteur est dans un état instable.
la source
Voici juste une bonne astuce pour obtenir la méthode error_handler actuelle =)
Je veux aussi noter que si vous appelez
PHP cesse d'afficher l'erreur. Sinon, le texte d'erreur sera envoyé au client avant votre gestionnaire d'erreurs.
la source
Puisque la plupart des réponses ici sont inutilement verbeuses, voici ma version non laide de la réponse la plus votée:
la source
Pas vraiment. Les erreurs fatales sont appelées ainsi, car elles sont fatales. Vous ne pouvez pas vous remettre d'eux.
la source
J'ai développé cette fonction pour rendre possible le code "sandbox" qui pourrait provoquer une erreur fatale. Depuis les exceptions levées de la fermeture
register_shutdown_function
ne sont pas émises à partir de la pile d'appels d'erreur pré-fatale, je suis obligé de quitter après cette fonction pour fournir un moyen uniforme de l'utiliser.la source
Il y a certaines circonstances dans lesquelles même des erreurs fatales devraient être détectées (vous devrez peut-être faire un peu de nettoyage avant de sortir gracieusement et ne pas simplement mourir ..).
J'ai implémenté un hook pre_system dans mon CodeIgniter applications afin que je puisse obtenir mes erreurs fatales par e-mails, ce qui m'a aidé à trouver des bogues qui n'ont pas été signalés (ou qui ont été signalés après leur correction, car je les connaissais déjà :)).
Sendemail vérifie si l'erreur a déjà été signalée afin de ne pas vous spammer plusieurs fois avec des erreurs connues.
la source