【发布时间】:2011-03-05 17:56:35
【问题描述】:
我正在运行带有 PHP 5.3.2 的 Apache 2.2.15,禁用了“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 确实 这些天自动将 HTTP 状态代码设置为 500。它在这里这样做。当然,没有 XDebug。
【问题讨论】: