6

首先我使用 PHP 5.4.3。

我遇到的问题是,每当 PHP 文件中发生错误(例如解析错误)时,它会在 HTML 中显示错误消息,并且页面的 HTTP 状态将为 200

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

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

4

4 回答 4

2

您可以使用寄存器关闭功能。来源:PHP:自定义错误处理程序 - 处理解析和致命错误

ini_set('display_errors', 0);

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

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

于 2013-03-02T22:25:32.867 回答
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 的版本。但是如上所述,如果您已经到了在生产系统上发生此类错误的地步,那是因为您未能正确完成工作。

于 2013-03-02T23:01:30.340 回答
0
  • error_reporting(0)使用;关闭错误报告
  • 发送您自己的 HTTP 状态代码header("HTTP/1.0 500 Internal Server Error");

参考

于 2013-03-02T22:12:04.307 回答
0

您可以简单地设置响应代码:

http_response_code(500);
于 2013-03-02T22:18:27.583 回答