代码之家  ›  专栏  ›  技术社区  ›  Armen Michaeli

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

  •  1
  • Armen Michaeli  · 技术社区  · 14 年前

    我使用PHP5.3.2运行Apache 2.2.15,禁用“显示错误”,禁用“显示启动错误”,启用“日志错误”。

    在我的设置(因此我认为它是一个规范),PHP中止致命错误,这是好的, 将HTTP状态代码设置为500 。致命错误包括E_错误、E_解析、E_核心错误、E_编译错误、E_用户错误,可能还有E_可恢复错误(自己无法触发,因此无法轻松检查发生了什么)。我认为这是一个好主意,它确实把代码设置为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。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Pekka    14 年前

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

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

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

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

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