Je développe une application PHP utilisant des codes de réponse HTTP pour la communication ainsi que des organismes de réponse. Il s'agit donc d'un scénario typique du code PHP: ... et le code typique dans les clients ressemble à: p> ceci est cool, tant que chaque erreur est bien prise en code PHP. P> Le problème: si, pour une raison quelconque du code PHP, se produit une erreur non capturée
3 Réponses :
Vous pouvez, bien sûr, Écrivez votre propre gestionnaire d'erreur . Cependant, toutes les erreurs PHP ne sont pas capables. Par exemple, une erreur de syntaxe n'autorisera même pas à votre code, y compris votre gestionnaire d'erreur. P>
Pour gérer les erreurs capturables, vous pouvez utiliser le Auto_append_file et auto_prepend_file < / a> directives pour placer votre code de code de traitement des erreurs. P>
Les erreurs non capitables sont un problème différent. Si PHP fonctionne comme Fast CGI , il générera automatiquement un code d'état 500 pour vous. Cependant, vous courez probablement PHP à travers un autre SAPI (tel que le module Apache). Aucune idée à ce sujet, désolé. (Je ferai rapport si je trouve quelque chose.) P>
Merci pour la réponse rapide! Oui, j'ai écrit un gestionnaire d'erreur personnalisé et d'exception, mais que vous avez raison, les erreurs incessionnelles sont le problème. Je vais googler sur ça ..
Quoi qu'il en soit, il est peu rare que ce type d'erreurs fatales aillées inaperçues, n'est-ce pas?
Les erreurs de syntaxe et autres erreurs mortelles ne peuvent être attrapées par aucun gestionnaire d'erreur
Les en-têtes de réponse ne sont pas envoyés avant que php écho em> le premier octet du corps de réponse. Vous pouvez modifier les en-têtes (et le code d'état) dans la période moyenne. Garder cela à l'esprit, voici une solution: Définissez votre script pour envoyer un code de réponse Assurez-vous simplement que le code de réponse Remarque: vous pouvez utiliser 500 code> au début du script et
200 code> à la fin. Voici un exemple: p>
200 code> est défini sur un seul emplacement de votre code. P>
http_response_code code>
(Php> = 5.4) au lieu de en-tête code>
. p> p>
Bonne idée +1 :) Mais il va toujours envoyer 200 OK si, par exemple, une erreur de syntaxe (fatale) est lancée.
Au moins sur PHP> = 5.3.19 Un script avec des erreurs de syntaxe génère 500 erreurs. Personne ne voudrait avoir un tel script sur un serveur de production de toute façon.
aujourd'hui Ce n'est plus un problème - depuis 5,3 php appris enfin à envoyer 503 sur erreur, pas 200 s> p>
err, il semble que ce soit 5.2.4 : p>
Modification du gestionnaire d'erreur pour envoyer http 500 au lieu de la page vierge sur les erreurs PHP. P> blockQuote>
Vous devez définir
display_errors = off code> pour le faire fonctionner p>
J'ai le comportement exact sur ma Windows Apache 2.4 avec PHP 5.4.5 P>
J'ai testé avec PHP 5.3.10. Une erreur de syntaxe par exemple entraînera toujours une 200 OK. Dans quelles circonstances PHP envoiera-t-elle le 503?
Votre mise à jour semble super !! Mais cela ne fonctionne toujours pas pour moi. J'ai testé avec PHP 5.3.10-1Buntu3.4. J'ai utilisé une page d'erreur de syntaxe simple erreur code> pour tester.
display_errors code> est désactivé. Je reçois toujours une page vierge et un code de réponse 200. J'utilise l'Apache2 Sapi. Connaissez-vous une combinaison PHP Version / Web Server avec celle que vous pouvez produire le 500?
@YourCommonSense, existe-t-il des moyens de remplacer temporairement le comportement 5.2.4, le forçant à montrer une page vierge sur des erreurs PHP?
@YourCommonsense, display_errors code> est 0 et la page envoie http 500. Peut-on remplacer ce comportement, le forçant à afficher une page vierge?
@Pacerier PHP Est-ce que B> montre une page vierge. Quelles que soient les décorations que vous pouvez voir, fournies par l'un ou l'autre navigateur (le plus probable que la plupart d'entre eux aime) ou un serveur Web (nécessite un réglage spécial). Essayez de demander votre page avec un agent de ligne de commande comme wget code> et voir
@YourcommonSense, désolé de ne pas être clair. Je veux dire remplacer le comportement HTTP 500, le forçant à montrer une page blanche http 200 à la place?
Avait une fois un client JavaScript à l'esprit. Enlevé la balise.
Désolé, j'ai mis à jour ma réponse.