Los errores fatales de PHP vuelven como código de estado 200 al cliente HTTP. ¿Cómo puedo hacer que devuelva un código de estado 500 (error interno del servidor)?¿Cómo puedo obtener php para devolver 500 al encontrar una excepción fatal?
Respuesta
header("HTTP/1.1 500 Internal Server Error");
Es una tontería que deba especificar manualmente la versión HTTP para emitir un código de estado. –
@DrewSears No creo que "tengas" que; solo podría usar el campo de encabezado 'Status' como en CGI. Pero debe decirse que para los programadores PHP que no están familiarizados con CGI, la sintaxis "HTTP/1.1" es más fácil de leer, porque, bueno, imita una respuesta HTTP. –
Desde PHP> = 5.4 existe la función 'http_response_code ([int $ responseCode])'. –
Usted puede utilizar el manejo de
Una buena respuesta consiste más que solo vincular a otras páginas. Por ejemplo, podría referirse a esa página en breve. ¿Qué sucede cuando el sitio de destino no funciona o mueve ese contenido? Además, w3schools no son una fuente tan buena. – Olli
http://w3fools.com/ ... –
error de PHP que tendría que coger el error que se produce utilizando try/catch y luego utilizar ese bloque catch para enviar un header() con el error 500.
try {
...badcode...
throw new Exception('error');
} catch (Exception $e) {
header("Status: 500 Server Error");
var_dump($e->getMessage());
}
Si la excepción grave no está rodeado de try {} bloques catch, entonces debe registrar un controlador global y utilizar register_shutdown_function()
para comprobar si hay un error al final del guión.
Eso detectará excepciones, pero no detectará errores fatales PHP, que se manejan fuera del alcance de las excepciones. –
Los errores fatales/de sintaxis no se pueden capturar hasta donde yo sé, ni por el manejo de errores ni por el manejo de excepción – ChrisR
@ChrisRamakers: He leído algo sobre el uso de manejadores de salida para atrapar errores fatales de PHP. –
No es posible manejar PHP E_ERROR de ninguna manera de acuerdo a la documentación de PHP: http://www.php.net/manual/en/function.set-error-handler.php
Tampoco es posible manejar "E_PARSE, E_CORE_ERROR E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, y la mayoría de E_STRICT", según a ese enlace
PUEDE proporcionar un controlador para el otro error, advertencia y avisos, incluido E_USER_ERROR, pero eso no es tan útil como parece, ya que este error solo se produce intencionalmente por el programador con trigger_error().
Y, por supuesto, puede capturar cualquier excepción (incluso las lanzadas por las funciones nativas de PHP).
Acepto que esto es un problema. Los servidores NO deben devolver 200 OK cuando el código de la aplicación falla y se quema.
He usado "set_exception_handler" para manejar excepciones no detectadas.
function handleException($ex) {
error_log("Uncaught exception class=" . get_class($ex) . " message=" . $ex->getMessage() . " line=" . $ex->getLine());
ob_end_clean(); # try to purge content sent so far
header('HTTP/1.1 500 Internal Server Error');
echo 'Internal error';
}
set_exception_handler('handleException');
Buena solución pero esto no funcionará si es un error fatal –
Puede hacer esto si quiere manejar errores fatales: http://stackoverflow.com/questions/277224/how-do-i-catch-a-php -fatal-error –
Utilice set_error_handler y set_exception_handler. El primero es para errores fatales de estilo antiguo, el segundo es para excepciones orientadas a objetos. –
Este es exactamente el problema que tuve ayer y me pareció la solución de la siguiente manera:
1) En primer lugar, tiene que coger PHP errores fatales, que es el tipo de error E_ERROR. cuando se produce este error, el script se almacenará el error y terminará la ejecución. puede obtener el error almacenado llamando a la función error_get_last().
2) antes de que finalice la secuencia de comandos, siempre se llamará a una función de devolución de llamada register_shutdown_function(). por lo tanto, debe registrar un controlador de errores mediante esta función para hacer lo que desee, en este caso, devolver el encabezado 500 y una página de error interno personalizada (opcional).
function my_error_handler()
{
$last_error = error_get_last();
if ($last_error && $last_error['type']==E_ERROR)
{
header("HTTP/1.1 500 Internal Server Error");
echo '...';//html for 500 page
}
}
register_shutdown_function('my_error_handler');
Nota: si desea capturar el tipo de error personalizado, que se inicia con E_USER *, puede utilizar la función set_error_handler() para registrar gestor de errores y el error de disparo por trigger_error función, sin embargo, este controlador de errores no puede manejar Tipo de error E_ERROR. ver explicación en php.red sobre error handler
Asegúrese de utilizar también 'ini_set (" display_errors "," off ");' en un entorno de producción; de lo contrario, los mensajes de error fatales se enviarán al cliente. – alexw
También sugiero que se compruebe E_PARSE, que también se puede capturar de esta forma, siempre que la función de apagado esté configurada antes de que se incluya el archivo con el error de análisis. – Brilliand
Nunca se olvide de establecer header("HTTP/1.1 200 OK", true, 200);
como la última línea de cualquier ruta de ejecución:
//first things first:
header("HTTP/1.1 500 Internal Server Error", true, 500);
//Application code, includes, requires, etc. [...]
//somewhere something happens
//die();
throw new Exception("Uncaught exception!");
//last things last, only reached if code execution was not stopped by uncaught exception or some fatal error
header("HTTP/1.1 200 OK", true, 200);
En PHP 5.4
puede reemplazar la función header
anterior con el mucho mejor http_response_code(200)
o http_response_code(500)
.
Eso no funciona si se genera alguna salida entre la primera y la última llamada 'header()', porque entonces el encabezado ya habrá sido enviado. Las páginas de trabajo pueden entregarse con el estado 500. Este enfoque es demasiado arriesgado. – Peter
Utilice el almacenamiento en búfer de salida y la salida después del encabezado. Lo cual es obvio Si el almacenamiento en búfer de salida falla de alguna manera, eso no es una página de trabajo, es una página con errores. –
Lo difícil cuando se trata de errores fatales (errores de compilación, por ejemplo, falta un punto y coma) es que el script no se ejecutará, por lo que no ayudará a establecer el código de estado en ese script. Sin embargo, cuando se incluye o requiere una secuencia de comandos, la secuencia de comandos de la llamada se ejecutará, independientemente de los errores en la secuencia de comandos incluida. Con esto, llego a esta solución:
sólido como una roca-script.php:
// minimize changes to this script to keep it rock-solid
http_response_code(500); // PHP >= 5.4
require_once("script-i-want-to-guard-for-errors.php");
guión-i-quiero-a-guardia-de-errors.php:
// do all the processsing
// don't produce any output
// you might want to use output buffering
http_response_code(200); // PHP >= 5.4
// here you can produce the output
Dirige tu llamada a rock-solid-script.php y ya estás listo.
Me hubiera gustado que fuera mejor configurar el código de estado predeterminado en 500 en .htaccess. Eso me parece más elegante, pero no puedo encontrar una manera de llevarlo a cabo. Probé el RewriteRule R-flag, pero esto impide la ejecución de php, así que no sirve de nada.
La configuración estándar de PHP hace devuelve 500 cuando se produce un error. Solo asegúrate de que display_errors = off. Puede simularlo con:
ini_set('display_errors', 0);
noFunction();
En producción la directiva display_errors está desactivada por defecto.
- 1. ¿Cómo puedo solucionar esta excepción fatal?
- 2. Catch PHP Fatal Error
- 3. Secuela, problema al obtener asociaciones para devolver
- 4. 500 Internal Server Error al usar HttpWebRequest, ¿cómo puedo obtener el error real?
- 5. ASP.NET MVC JsonResult devolver 500
- 6. PHP "Excepción no encontrada"
- 7. PHP - Error al devolver una matriz desde una función recursiva
- 8. lanzar una excepción o devolver null
- 9. Excepción PHP PDO: no se pudo encontrar el controlador
- 10. PHP open_basedir - para devolver valor?
- 11. Fatal Error PHP, Pear?
- 12. ¿Debo devolver nulo o lanzar una excepción?
- 13. Cuándo devolver bool, lanzar una excepción y qué excepción arrojar
- 14. PHP Error fatal: Class 'HttpRequest' no encontrado
- 15. ¿Cómo puedo obtener una expresión regular para encontrar todas las coincidencias en javascript?
- 16. ¿Cómo generar una excepción ActiveRecord :: Rollback y devolver un valor?
- 17. Cómo obtener una función para devolver diferentes tipos
- 18. Cómo lanzar una excepción matriz en PHP
- 19. ¿Cómo puedo encontrar el ancho de una imagen usando PHP?
- 20. Obtener contexto de excepción en PHP
- 21. ¿Cómo puedo escribir una prueba para manejar una excepción esperada?
- 22. Apache ErrorDocument no funciona para PHP 500 error
- 23. PHP FPM devuelve HTTP 500 para todos los errores de PHP
- 24. ¿Dónde puedo encontrar una aplicación PHP MVC de muestra?
- 25. ¿Cuándo debería lanzar una excepción en lugar de devolver un error en PHP?
- 26. ¿Cómo puedo obtener el código de subestación IIS de una excepción?
- 27. En un controlador de excepción C#, ¿puedo encontrar los parámetros que se pasaron al método que generó la excepción?
- 28. Registro de excepción ASP clásico (errores 500 y 500.100)
- 29. obtener una transacción Webkit executeSql para devolver un valor
- 30. Apache 500 Error con PHP Fun
¿te refieres a error fatal? – Xinus
el hecho de que php devuelva un error que no está relacionado con el encabezado HTML que obtiene en el navegador. Si ejecuta ese script desde la línea de comando, no obtendrá ningún código de error 200 –
Consulte http://stackoverflow.com/questions/2331582/catch-php-fatal-error para obtener una solución. – cweiske