如何让 PHP 在出现任何错误情况时自动将 HTTP 状态代码设置为 500? (包括用户无法处理的)

问题描述 投票:0回答:2

我正在运行 Apache 2.2.15 和 PHP 5.3.2,禁用“display_errors”,禁用“display_startup_errors”,启用“log_errors”。

在我的设置中(所以我认为这是一种常态),PHP 在出现致命错误时中止,这很好,并且 将 HTTP 状态代码设置为 500。致命错误包括 E_ERROR、E_PARSE、E_CORE_ERROR、E_COMPILE_ERROR、E_USER_ERROR 以及可能的 E_RECOVERABLE_ERROR(无法自己触发它,因此无法轻松检查发生了什么)。我认为将代码设置为 500 是个好主意,因为我认为这是正确的做法 - 显然,如果您的脚本包含语法错误和/或无法执行运行时应该执行的操作,那么它是如果我们将 PHP 视为服务器的一部分,则会出现服务器错误。

现在,这是重要的部分:

无论如何,我现在已经安装了 XDebug 来更好地跟踪错误,但我现在可以看到,无论错误如何,即使脚本像以前一样因致命错误而中止,HTTP 状态代码始终为 200。这破坏了我通过 HTTP 与 Apache/PHP 进行“对话”的客户端:|

此外,将 display_errors 设置为 On/1,使 PHP 不再将 HTTP 状态代码设置为 500,并且表现出与上面的 XDebug 完全相同的行为。

我非常依赖这里可靠的状态代码行为,这一切都让我相信这是某种侥幸或像天气一样随机......或者我错过了什么?

更新

有一篇博客文章概述了这个问题: http://talideon.com/weblog/2008/02/php-errors.cfm

就我而言,我已禁用 XDebug,因为它是导致不良行为的首要原因。无论如何,我只将它用于堆栈跟踪,现在使用自定义错误处理程序来代替。另外,链接的文章是 2008 年的,显然 PHP does 这些天自动将 HTTP 状态代码设置为 500。这里也是如此。当然,没有 XDebug。

php apache http xdebug
2个回答
2
投票

我假设您正在使用自定义错误处理程序来发出 500。

我不太了解 XDebug,但根据 这篇文章,它注册了自己的错误处理程序,可能会在此过程中覆盖您的错误处理程序:

请注意,如果您使用 register_error_handler() 定义自定义错误处理程序,则 xdebug 的扩展错误显示将不起作用。这是因为 xdebug 内部使用相同的机制。如果您的脚本使用自定义错误处理程序,您仍然可以使用函数 xdebug_get_function_stack() 在自定义错误处理程序中输出堆栈跟踪。

但是,对于生产用途,您无论如何都不会激活 XDebug,不是吗?

至于为什么激活

display_errors()
时会输出200,我不明白。你可以发布你的自定义错误处理函数来看看吗?


0
投票

这应该对你们有帮助。 固定

if(1 == ini_get('display_errors')) {
  register_shutdown_function(function() {
    if (error_get_last()['type']??0 == E_ERROR) {
        http_response_code(500);
    }
  });
}

© www.soinside.com 2019 - 2024. All rights reserved.