如果PHP文件中发生任何错误,则强制HTTP状态为500

时间:2013-03-02 22:09:26

标签: php

首先,我使用PHP 5.4.3。

我遇到的问题是,只要PHP文件中出现错误(例如解析错误),它就会在HTML 中显示错误消息,并且页面的HTTP状态将为200

我想知道的是,如果发生任何错误,如何将HTTP状态设置为500 ,并且根本不显示任何错误。

请记住,我不想为每个页面显示HTTP状态500,只有少数几个。

4 个答案:

答案 0 :(得分:2)

您可以使用注册关闭功能。资料来源:PHP : Custom error handler - handling parse & fatal errors

ini_set('display_errors', 0);

function shutdown() {
    if (!is_null(error_get_last())) {
        http_response_code(500);
    }
}
register_shutdown_function('shutdown');

注意,E_PARSE错误只会在注册关闭功能后包含/需要的文件中捕获。

答案 1 :(得分:1)

myninjaname的答案几乎是正确的 - 但是你不知道退出时输出缓冲区发生了什么。此外,您的代码将始终运行完成。除了立即处理情况之外,我还会使用输出缓冲和自定义error_handler,保证对浏览器的响应,这也使得更容易捕获和记录与错误相关的信息,以便您可以修复任何错误:

<?php

ob_start();

set_error_handler('whoops');

function whoops($errno, $errstr, $errfile, $errline, $errcontext)
{
  header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
  $logged="$errno: $errstr\nin $errfile at $errline\n";
  foreach($errcontext as $scoped=>$val) {
      $logged.=" $scoped = $val\n";
  }
  $logged.="Output = " . ob_get_clean() . "\n";
  // NB still buffering...
  debug_print_backtrace();
  $logged.="stack trace = " . ob_get_clean() . "\n";
  print "whoops";
  ob_end_flush();
  write_log_file($logged);
  exit;
}

您可以真正处理解析错误 - 当您编写和部署错误代码时会发生错误 - 您应该知道如何防止在生产系统上发生这种情况。添加更多代码以尝试解决问题是一种矛盾。

您还应该通过在ini文件中设置display_errors=0来停止显示错误(而不是报告)。

<强>更新

  

我试图捕获自定义错误处理程序发生的任何错误,但由于某些原因,人们说它不会捕获解析错误(以及其他一些错误)。

你不知道如何自己测试吗? IIRC很大程度上取决于上下文(关闭函数可以捕获包含内容中的一些解析错误)和PHP的版本。但如上所述,如果您已经到了生产系统上发生此类错误的程度,那是因为您未能正确地完成工作。

答案 2 :(得分:0)

  • 使用error_reporting(0);
  • 关闭错误报告
  • 使用header("HTTP/1.0 500 Internal Server Error");
  • 发送您自己的HTTP状态代码

<强>参考

答案 3 :(得分:0)

您只需设置响应代码:

http_response_code(500);