Comment puis-je obtenir php revenir 500 lors de la rencontre d'exception fatale?
PHP erreurs fatales de revenir en tant que code d'état 200 pour le client HTTP. Comment puis-je faire pour retourner un code d'état 500 (erreur Interne du serveur)?
- voulez-vous dire erreur fatale ?
- le fait de php renvoie une erreur qui n'est pas liée à l'en-tête HTML que vous obtenez dans le navigateur. Si vous exécutez le script à partir de la ligne de commande, vous ne obtenir quelque 200 code d'erreur
- Voir stackoverflow.com/questions/2331582/catch-php-fatal-error une solution.
- J'ai besoin de l'exact opposé. J'ai mis en place une fonction d'arrêt qu'avec
auto_prepend_file
captures de toutes les erreurs fatales. Cependant, je veux aussi avoirstatus code 200
envoyé lorsque que la fonction est appelée. Mais je continue à recevoir desstatus code 500
.
Vous devez vous connecter pour publier un commentaire.
Status
champ d'en-tête comme dans CGI. Mais il faut dire que pour les programmeurs PHP pas familier avec CGI, le "HTTP/1.1" syntaxe est plus facile à lire, parce que, eh bien, il imite une réponse HTTP.http_response_code([int $responseCode])
fonction.C'est exactement le problème que j'ai eu hier et j'ai trouvé la solution comme suit:
1) tout d'abord, vous avez besoin pour attraper PHP erreurs fatales, qui est le type d'erreur E_ERROR. lorsque cette erreur se produit, le script sera stocké l'erreur et terminer l'exécution. vous pouvez obtenir le stockés erreur en appelant la fonction error_get_last().
2) avant de script terminé, une fonction de rappel register_shutdown_function() sera toujours appelé. donc, vous devez vous inscrire à un gestionnaire d'erreur par cette fonction pour faire ce que vous voulez, dans ce cas, le retour de l'en-tête 500 et un interne personnalisé page d'erreur (en option).
Remarque: si vous voulez attraper personnalisé type d'erreur, qui commencent avec E_USER*, vous pouvez utiliser la fonction set_error_handler() pour enregistrer gestionnaire d'erreurs et de déclencher d'erreur en fonction trigger_error, cependant, ce gestionnaire d'erreur ne peut pas gérer E_ERROR type d'erreur. voir l'explication à la php.net sur gestionnaire d'erreur
ini_set("display_errors", "off");
dans un environnement de production, sinon l'erreur fatale messages seront envoyés au client.J'ai utilisé "la fonction set_exception_handler" pour gérer les exceptions.
Il n'est pas possible de gérer PHP E_ERROR, en quelque sorte, selon la documentation PHP:
http://www.php.net/manual/en/function.set-error-handler.php
Ni est possible de manipuler des "E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, et la plupart des E_STRICT", selon ce lien.
Vous POUVEZ fournir un gestionnaire pour l'autre erreur, d'avertissement et d'avis, y compris E_USER_ERROR, mais ce n'est vraiment pas aussi utile que ça, puisque cette erreur ne devient jeté intentionnellement par le programmeur avec trigger_error().
Et bien sûr, vous pouvez prendre l'une Exception (même ceux qui sont jetés par les fonctions PHP natives).
Je suis d'accord que c'est un problème. Les serveurs ne doivent PAS retourner à 200 OK lorsque le code de l'application se bloque et les brûlures.
error_get_last()
à l'intérieur de la fonction d'arrêt.. si la dernière erreur a été fatale.. tadaStandard de configuration de PHP ne retour 500 lorsque l'erreur se produit! Assurez-vous que votre display_errors = off. Vous pouvez le simuler avec:
Sur la production directive display_errors est désactivée par défaut.
La chose difficile lorsque l'on traite avec fatal errors (erreurs de compilation, par exemple, un point-virgule manquant), c'est que le script ne sera pas exécutée, de sorte qu'il ne va pas aider à définir le statut de code dans le script. Toutefois, lorsque vous incluez ou besoin d'un script, le script sera exécuté, indépendamment des erreurs dans le script inclus. Avec cela, j'en arrive à cette solution:
rock-solid-script.php:
script-i-want-to-guard-for-errors.php:
Diriger votre appel à l'rock-solid-script.php et vous êtes prêt à aller.
J'aurais aimé mieux définir le statut par défaut de code à 500 .htaccess. Celui qui semble le plus élégant pour moi, mais je ne peux pas trouver un moyen de s'en sortir. J'ai essayé la règle de réécriture R-drapeau, mais cela empêche l'exécution de php au total, donc, ce n'est pas utiliser.
Vous pouvez utiliser php erreur de manipulation
http://www.w3schools.com/php/php_error.asp
Vous devez attraper le jeté de l'erreur à l'aide de try/catch et ensuite utiliser le bloc catch pour envoyer un l'en-tête() avec l'erreur 500.
Si l'exception fatale n'est pas entouré par un try {} catch alors vous devez vous inscrire mondial de gestionnaire et de l'utilisation
register_shutdown_function()
pour vérifier une erreur à la fin du script.register_shutdown_function()
pour attraper E_FATAL erreurs.Ne jamais oublier de mettre
header("HTTP/1.1 200 OK", true, 200);
que la dernière ligne d'un chemin d'exécution:Dans
PHP 5.4
vous pouvez remplacer leheader
fonction ci-dessus avec le beaucoup mieuxhttp_response_code(200)
ouhttp_response_code(500)
.header()
appel, parce qu'alors, les en-têtes ont déjà été envoyés. Pages peut être livré avec un statut de 500. Cette approche est beaucoup trop risqué.