【问题标题】:How to make PHP set HTTP status code to 500 automatically in case of any error condition? (including those that cannot be handled by user)如果出现任何错误情况,如何让 PHP 自动将 HTTP 状态码设置为 500? (包括用户无法处理的)
【发布时间】: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。

【问题讨论】:

    标签: php apache http xdebug


    【解决方案1】:

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

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

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

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

    至于为什么激活display_errors()时会输出200,我不明白。你能发布你的自定义错误处理函数来看看吗?

    【讨论】:

    • 诺诺诺,我什么都不发射!我希望 PHP 在发生错误时将代码设置为 500,无论是我自己触发它还是解析或运行脚本出错。即使在生产中我不会激活它,但在启用 XDebug 时我无法使用我的脚本,因为状态代码已损坏,这意味着我可以使用“发布”配置文件进行测试,也可以在没有 XDebug 的情况下进行调试。我没有任何自定义错误处理程序,你为什么认为我有一个? :-)
    • Pekka,我发现有人在与我完全相同的问题上表达自己的能力比我好得多:talideon.com/weblog/2008/02/php-errors.cfm 我想知道这是否已经解决了。我的意思是,这家伙是完全正确的还是什么!
    • @amn 很有趣,而且肯定是一个好点!但是您当前如何让 PHP 发出 500 错误?是否有 INI 设置?
    • 不,就是这样 - 显然,自从链接帖子以来,PHP 开发人员已经意识到,因为我的 PHP (5.3.2) 确实 将 HTTP 代码设置为 500错误。但是一旦我启用 XDebug,无论如何它都会回到 200 OK。我现在禁用了 XDebug,并使用了一个自定义错误处理程序来打印堆栈(无论如何我在 XDebug 中都需要)。也许我会编辑原始问题以反映更改。
    • 我问了一个问题:stackoverflow.com/questions/3075355/…
    猜你喜欢
    • 2013-02-17
    • 2011-05-22
    • 2023-04-09
    • 1970-01-01
    • 2019-09-18
    • 2019-03-24
    • 2011-06-15
    • 2021-03-15
    • 2021-12-04
    相关资源
    最近更新 更多