7
votes

Comment laisser Apache envoyer 500 en cas d'erreur PHP?

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: xxx

... et le code typique dans les clients ressemble à: xxx

ceci est cool, tant que chaque erreur est bien prise en code PHP.

Le problème: si, pour une raison quelconque du code PHP, se produit une erreur non capturée ou une erreur non inconnue comme des erreurs de syntaxe , Apache enverra 200 OK. Mais je ne suis pas Apache pour dire 500 erreurs de serveur internes. Peut-être par .htaccess ou donc.


2 commentaires

Avait une fois un client JavaScript à l'esprit. Enlevé la balise.


Désolé, j'ai mis à jour ma réponse.


3 Réponses :


2
votes

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.

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.

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


3 commentaires

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



2
votes

Les en-têtes de réponse ne sont pas envoyés avant que php écho 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 500 au début du script et 200 à la fin. Voici un exemple: xxx

Assurez-vous simplement que le code de réponse 200 est défini sur un seul emplacement de votre code.

Remarque: vous pouvez utiliser http_response_code (Php> = 5.4) au lieu de en-tête .


2 commentaires

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.



2
votes

aujourd'hui Ce n'est plus un problème - depuis 5,3 php appris enfin à envoyer 503 sur erreur, pas 200

err, il semble que ce soit 5.2.4 :

Modification du gestionnaire d'erreur pour envoyer http 500 au lieu de la page vierge sur les erreurs PHP.

Vous devez définir display_errors = off pour le faire fonctionner

J'ai le comportement exact sur ma Windows Apache 2.4 avec PHP 5.4.5


6 commentaires

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 pour tester. display_errors 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 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 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 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?