Arrêter l'exécution du script sur avis/avertissement
Est-il possible d'avoir PHP arrêter l'exécution sur un avis/d'avertissement, à l'échelle mondiale?
Nous avons un serveur de développement avec beaucoup de sites, mais que vous voulez de la force de nos développeurs pour corriger ces mises en garde/avis (ou demander de l'aide avec eux au moins) au lieu de l'ignorer et passer à la suite.
Vous devez vous connecter pour publier un commentaire.
Oui, c'est possible. Cette question parle de la question plus générale de la façon de gérer les erreurs dans PHP. Vous devez définir et enregistrer un gestionnaire d'erreur personnalisé à l'aide de
set_error_handler
docs pour personnaliser la manipulation pour les erreurs PHP.À mon humble avis il est préférable de lever une exception sur une erreur PHP et l'utilisation de blocs try/catch programme de contrôle de flux, mais les opinions diffèrent sur ce point.
Pour accomplir les OP à l'objectif que vous pourriez faire quelque chose comme:
Le code ci-dessus va jeter un
ErrorException
tout moment unE_NOTICE
ouE_WARNING
est soulevée, mettre un terme à la sortie de script (si l'exception n'est pas pris). De lever des exceptions sur des erreurs PHP est le meilleur combiné avec, en parallèle, une stratégie de gestion des exceptions (fonction set_exception_handler
) pour se terminer normalement dans les environnements de production.Noter que l'exemple ci-dessus de ne pas respecter les
@
la suppression d'erreur de l'opérateur. Si cela est important pour vous, il suffit d'ajouter une case avec leerror_reporting()
fonction comme démontré ici:auto_prepend_file
réglage.auto_prepend_file
.auto_prepend_file
est trop "magique" et il est difficile de regarder votre code exactement ce qui se passe. Dire à quelqu'un d'autre a à maintenir votre code. Comment ils savent que vous avez enterré "auto include" en php.ini? Et si ce auto ajouter fichier comporte des erreurs? Parler d'un débogage de la santé mentale cauchemar. Il n'y a aucune bonne raison de ne pas simplement utiliserrequire
directement dans votre code.auto_prepend_file
est un terrible idée à mon humble avis.Vous pouvez configurer globalement ce au sein de votre php.fichier iniDocs.
Vous faites cela en spécifiant un fichier qui est inclus par tous les processus PHP avec le
auto_prepend_file
la directiveDocs:Faire qu'à l'intérieur de vous mondial de php.fichier ini permettra de s'assurer que le code de la faire précéder de fichier sera toujours exécutée. Vous pouvez l'utiliser pour enregistrer un gestionnaire d'erreurs globales qui tourner toutes les erreurs dans les exceptionsDocs:
Ce petit script va tourner toutes les erreurs/avertissements/avis etc. dans un
ErrorException
.De le combiner avec le
error_reporting
directive iniDocs, les valeurs sont décrivez dans votre php.fichier ini.Lancer une exception est un très stricte chose. Vos programmeurs sera obligé de composer avec des avertissements et des erreurs sinon le code ne fonctionne pas.
C'est probablement trop pour vos programmeurs et pas socialement acceptable au sein de votre entreprise. Au lieu de cela, vous pouvez également enregistrer toutes les erreurs et de les ajouter à la fin de la sortie (ou l'en-tête de sorte qu'il est plus visible) par l'utilisation de tampons de sortie.
Une autre alternative est de journal des erreurs et des avertissements pour le fichier journal, puis de surveiller ce fichier avec un autre processus et de regrouper les informations. Vous pouvez créer un tableau de bord qui affiche le nombre de mises en garde par application et la rendre visible dans le bureau, de sorte que tout le monde voit bien comment une équipe effectue ou du plaisir comme ça.
Ce que j'essaie de dire, c'est: à Côté du problème technique, c'est un problème social, vous devez être créatif avec et le fait de parler de ce problème de vos développeurs. Vous devez indiquer clairement pourquoi il est important de corriger les avertissements et d'erreurs, et comment leur codage et de compétences en bénéficier.
auto_prepend_file
. Je pense que le code doit être explicite sur ce qui se passe. Je ne veux pas de php.directive ini entraîner dans la magie d'un comportement que je ne peux pas voir dans le code source. À mon humble avis c'est bien mieux de faire une simplerequire
appel. Ce qui se passe un mois à partir de maintenant, lorsque vous regardez un morceau de code et que vous perdez votre esprit, car il ne comprend pas pourquoi il se passe quelque chose? Qu'advient-il si un nouveau développeur a rejoint l'équipe? Ils n'ont aucune idée que php.directive ini est automatiquement y compris le code.auto_prepend_file
etauto_append_file
inutilement de vous enfermer dans des comportements spécifiques et je vois cela comme un de PHP des "Mauvaises Pièces." Juste mes deux cents 🙂check-mark
envie 🙂Depuis PHP 5.3.0:
Si vous êtes dans un environnement de développement, vous pouvez envisager d'installer le module de Xdebug et définir
xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE
quelque part dans votre PHP les fichiers ini. Le développeur peut réinitialiserxdebug.halt_level
, mais nous avons le même problème avec la réponse repose surset_error_handler
, parce que nous pouvons restaurer le maître-chien à sa valeur d'origine.Les autres solutions que de mettre en œuvre un gestionnaire d'erreur personnalisé qui remplace l'erreur par défaut le mécanisme de journalisation. Cela signifie que lorsque nous avons fixé un gestionnaire d'erreur personnalisé, l'avis /l'avertissement n'est plus affiché dans la méthode par défaut, alors on change de plus que juste "arrêter l'exécution du script sur avis /avertissement".
Cependant, j'ai besoin d'un moyen de toujours imprimer le message, dans mon cas en PHP CLI - depuis la sortie est ensuite analysé par un autre programme. Donc je ne veux pas imprimer le message dans d'une certaine façon mais exactement de la même manière que PHP n'est généralement il. Je juste voulais arrêter le PHP CLI processus avec un code de sortie
!= 0
droit après un préavis d'alerte a été imprimé, et ne pas changer quoi que ce soit d'autre.Malheureusement, il ne semble pas être un défaut façon de sortir du script sans changer toute erreur de manipulation. J'ai donc besoin de réimplémenter le gestionnaire d'erreurs par défaut (qui est implémenté en C) en PHP.
Pour cela, j'ai regardé dans l'erreur par défaut mécanisme d'impression en PHP avec code source, et porté les éléments pertinents de C à PHP pour obtenir l'erreur suivante gestionnaire, ce que je veux partager avec vous au cas où vous avez besoin de quelque chose de similaire:
Vous pouvez activer la error_reporting à E_ALL dans le fichier de Configuration de PHP de votre serveur.
En PHP 5, un nouveau niveau d'erreur E_STRICT est disponible. Comme E_STRICT n'est pas inclus dans E_ALL vous devez activer explicitement ce niveau d'erreur. Permettant E_STRICT au cours du développement a certains avantages. STRICTE des messages vous aideront à utiliser la plus récente et la méthode de codage, par exemple, de vous avertir à propos de l'utilisation déconseillée fonctions.
Référence: Manuel de Configuration de PHP
Les paramètres suivants vous guider vers la sortie de toutes les erreurs dans un script. Veuillez noter que celles-ci devront être inclus dans le début de tous vos fichiers de script.