2010-08-05 21 views
7

Estoy desarrollando una aplicación PHP que utiliza códigos de respuesta HTTP para comunicación y cuerpos de respuesta. Así que este es un caso típico en el código PHP:¿Cómo dejar que Apache envíe 500 en caso de error de PHP?

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

... y el código típico de los clientes se ve así:

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

Esto es muy bueno, siempre y cuando cada error es bien atrapado en Código PHP

El problema: si, por cualquier motivo en el código php se produce un error no detectado o un error incurable como los errores de sintaxis, Apache enviará 200 OK. Pero quiero apache para decir 500 Internal Server Error. Quizás por .htaccess o más.

+1

Por qué la etiqueta de JavaScript? –

+0

Tenía una vez un cliente de Javascript en mente. Se eliminó la etiqueta. – hek2mgl

+0

Lo siento, actualicé mi respuesta. –

Respuesta

2

Puede, por supuesto, write your own error handler. Sin embargo, no todos los errores de PHP son detectables. Por ejemplo, un error de sintaxis ni siquiera permitirá la ejecución de su código, incluido el controlador de errores.

Para manejar los errores detectables, puede usar las directivas auto_append_file y auto_prepend_file para colocar su código de código de manejo de errores.

Los errores no detectables son un problema diferente. Si PHP se ejecuta como Fast CGI, automáticamente generará un código de estado de 500 para usted. Sin embargo, probablemente esté ejecutando PHP a través de otro SAPI (como el módulo de Apache). No tengo idea de eso, lo siento. (Informaré si encuentro algo.)

+0

¡Gracias por la respuesta rápida! Sí, escribí un controlador personalizado de errores y excepciones, pero tiene razón, los errores no detectables son el problema. Estoy buscando en Google en este .. – hek2mgl

+0

Como sea, es poco común que tales errores fatales pasen inadvertidos, ¿no? –

+0

errores de sintaxis y otros errores fatales no pueden ser detectados por ningún manejador de errores – stillstanding

2

Los encabezados de respuesta no se envían hasta PHP hace eco de el primer byte del cuerpo de respuesta. Puede cambiar los encabezados (y el código de estado) mientras tanto. Teniendo esto en cuenta, aquí hay una solución:

Configure su secuencia de comandos para enviar un código de respuesta 500 al comienzo del script y 200 al final. He aquí un ejemplo:

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"; 

Sólo hay que asegurarse de que el código 200 de respuesta se establece en una sola ubicación en el código.

Nota: puede usar http_response_code (PHP> = 5.4) en lugar de header.

+0

Idea agradable +1 :) Pero aún enviará 200 OK si, por ejemplo, se produce un error de sintaxis (fatal). – hek2mgl

+0

Al menos en PHP> = 5.3.19 un script con errores de sintaxis genera 500 error. A nadie le gustaría tener una secuencia de comandos así en un servidor de producción. –

2

Hoy en día ya no es un problema - desde 5.3 PHP aprendido al fin de enviar 503 en caso de error, no 200

Err, parece que fue 5.2.4:

gestor de errores Se cambió para enviar HTTP 500 en lugar de página en blanco en los errores de PHP.

Es necesario configurar display_errors = off para que funcione

tengo el comportamiento exacto en mis ventanas Apache 2.4 con PHP 5.4.5

+0

He probado con PHP 5.3.10. Un error de sintaxis, por ejemplo, todavía dará como resultado un 200 OK. ¿Bajo qué circunstancias PHP enviará el 503? – hek2mgl

+0

¡Su actualización suena genial! Pero todavía no funciona para mí. Lo he probado con PHP 5.3.10-1ubuntu3.4. Usé una página de error de sintaxis simple ' hek2mgl

+0

@YourCommonSense, ¿existen formas de anular temporalmente el comportamiento 5.2.4, forzándolo a mostrar una página en blanco en los errores de PHP? – Pacerier

Cuestiones relacionadas