Mik*_*ike 50 php error-handling error-code
PHP致命错误作为状态代码200返回到HTTP客户端.如何让它返回状态码500(内部服务器错误)?
Chr*_*ung 50
header("HTTP/1.1 500 Internal Server Error");
Run Code Online (Sandbox Code Playgroud)
fuy*_*uyi 23
这正是我昨天遇到的问题,我发现解决方案如下:
1)首先,您需要捕获PHP致命错误,这是错误类型E_ERROR.发生此错误时,脚本将存储错误并终止执行.您可以通过调用函数error_get_last()来获取存储的错误.
2)在脚本终止之前,将始终调用回调函数register_shutdown_function().所以你需要通过这个函数注册一个错误处理程序来做你想要的,在这种情况下,返回标题500和一个自定义的内部错误页面(可选).
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');
Run Code Online (Sandbox Code Playgroud)
注意:如果要捕获以E_USER*开头的自定义错误类型,可以使用函数set_error_handler()来注册错误处理程序并通过函数trigger_error触发错误,但是,此错误处理程序无法处理E_ERROR错误类型.在php.net上看到关于错误处理程序的解释
自 PHP >= 5.4 起
http_response_code(500);
echo json_encode( [ 'success' => false , 'message' => 'Crazy thing just happened!' ]);
exit();
Run Code Online (Sandbox Code Playgroud)
请先设置httpCode echo。
标准 PHP 配置确实在发生错误时返回 500!只需确保您的 display_errors = off。你可以模拟它:
ini_set('display_errors', 0);
noFunction();
Run Code Online (Sandbox Code Playgroud)
在生产中 display_errors 指令默认关闭。
小智 6
我已经使用“ set_exception_handler”来处理未捕获的异常。
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');
Run Code Online (Sandbox Code Playgroud)