2010-08-05 3 views
7

Je développe une application PHP qui utilise des codes de réponse HTTP pour la communication ainsi que des corps de réponse. Donc, c'est un scénario typique dans le code PHP:Comment laisser Apache envoyer 500 en cas d'erreur PHP?

try { 
    doSomething(); 
} 
catch (Exception $e) { 
    header('HTTP/1.1 500 Internal Server Error'); 
} 

... et le code typique clients ressemble:

switch(responseCode) { 
    case 200 : 
     // all fine 
     // .... 
    case 500 : 
     // trouble! 
} 

C'est cool, aussi longtemps que chaque erreur est bien pris dans Code PHP. Le problème: Si, pour une raison quelconque dans le code php, se produit une erreur non saisie ou une erreur non corrigible comme les erreurs de syntaxe, Apache enverra 200 OK. Mais je ne voulais pas dire apache 500 Erreur interne du serveur. Peut-être par. Htaccess ou alors.

+1

Pourquoi la balise JavaScript? –

+0

Avait une fois un client javascript à l'esprit. Retiré l'étiquette. – hek2mgl

+0

Désolé, a mis à jour ma réponse. –

Répondre

2

Vous pouvez, bien sûr, write your own error handler. Cependant, toutes les erreurs PHP ne sont pas capturables. Par exemple, une erreur de syntaxe n'autorisera même pas l'exécution de votre code, y compris votre gestionnaire d'erreurs.

Pour gérer les erreurs détectables, vous pouvez utiliser les directives auto_append_file et auto_prepend_file pour placer votre code de code de gestion des erreurs.

Les erreurs non détectables sont un problème différent. Si PHP s'exécute comme Fast CGI, il génère automatiquement un code d'état 500 pour vous. Cependant, vous utilisez probablement PHP via d'autres SAPI (comme le module Apache). Aucune idée à ce sujet, désolé. (Je rapporterai si je trouve quelque chose.)

+0

Merci pour la réponse rapide! Oui, j'ai écrit un gestionnaire d'erreur et d'exception personnalisé, mais vous avez raison, les erreurs non détectables sont le problème. Je googling sur ce .. – hek2mgl

+0

Quoi qu'il en soit, il est rare que de telles erreurs fatales passent inaperçues, n'est-ce pas? –

+0

erreurs de syntaxe et autres erreurs fatales ne peuvent pas être attrapés par un gestionnaire d'erreur – stillstanding

2

Les en-têtes de réponse ne sont pas envoyés avant que PHP échoue le premier octet du corps de la réponse. Vous pouvez changer les en-têtes (et le code d'état) entre temps. Gardez 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:

header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error'); 

if (rand(0, 1) == 1) { 
    die("Script terminated prematurely"); 
} 

header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK'); 
echo "Success"; 

Juste assurer que le code de réponse 200 est fixé à un seul emplacement dans votre code. Remarque: vous pouvez utiliser http_response_code (PHP> = 5.4) au lieu de header.

+0

Belle idée +1 :) Mais il enverra encore 200 OK si par exemple une erreur de syntaxe (fatale) est levée. – hek2mgl

+0

Au moins sur PHP> = 5.3.19 un script avec des erreurs de syntaxe génère 500 erreur. Personne ne voudrait avoir un tel script sur un serveur de production de toute façon. –

2

Aujourd'hui, il n'y a plus un problème - depuis 5.3 PHP appris enfin à envoyer 503 en cas d'erreur, pas 200

Err, il semble qu'il était 5.2.4:

gestionnaire d'erreurs Changed envoyer HTTP 500 au lieu d'une page vierge sur les erreurs PHP.

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

J'ai le comportement exact sur mes fenêtres Apache 2.4 avec PHP 5.4.5

+0

J'ai testé avec PHP 5.3.10. Une erreur de syntaxe par exemple entraînera toujours un 200 OK. Dans quelles circonstances PHP enverra-t-il le 503? – hek2mgl

+0

Votre mise à jour sonne bien !! Mais ça ne marche toujours pas pour moi. J'ai testé avec PHP 5.3.10-1ubuntu3.4. J'ai utilisé une simple page d'erreur de syntaxe ' hek2mgl

+0

@YourCommonSense, existe-t-il des moyens de surcharger temporairement le comportement 5.2.4, en le forçant à afficher une page blanche sur les erreurs PHP? – Pacerier

Questions connexes