如何在遇到致命异常时让php返回500?

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)

  • 愚蠢的是,您必须手动指定HTTP版本才能发出状态代码. (11认同)
  • 由于PHP> = 5.4,因此存在`http_response_code([int $ responseCode])`函数. (3认同)

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上看到关于错误处理程序的解释

  • 一定要在生产环境中使用`ini_set("display_errors","off");`否则会将致命的错误消息发送回客户端. (4认同)

van*_*102 8

自 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。


luk*_*yer 7

标准 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)

  • 使用 set_error_handler 和 set_exception_handler。第一个用于旧式致命错误,第二个用于面向对象的异常。 (2认同)