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

如何使PHP在出现错误情况时自动将HTTP状态代码设置为500?(包括用户无法处理的),php,apache,http,xdebug,Php,Apache,Http,Xdebug,我使用PHP5.3.2运行Apache2.2.15,“显示错误”被禁用,“显示启动错误”被禁用,“日志错误”被启用 在我的设置(所以我认为它是一个规范),PHP中止致命错误,这是好的,并将HTTP状态代码设置为500。致命错误包括E_错误、E_解析、E_核心错误、E_编译错误、E_用户错误,可能还有E_可恢复错误(自己无法触发,因此无法轻松检查发生了什么)。我认为把代码设置为500是个好主意,因为我认为这是正确的做法——很明显,如果您的脚本包含语法错误和/或在运行时不应该做什么,那么如果我们考虑

我使用PHP5.3.2运行Apache2.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完全相同的行为

我非常依赖于可靠的状态代码行为,这一切让我相信这是某种侥幸或随机的天气。。还是我遗漏了什么

更新

有一篇博文对这一问题进行了讨论:


就我而言,我已经禁用了XDebug,因为它首先是导致不良行为的原因。无论如何,我只将其用于堆栈跟踪,现在使用自定义错误处理程序来代替。另外,这篇链接文章是从2008年开始的,显然PHP最近确实自动将HTTP状态代码设置为500。在这里是这样的。当然没有XDebug。

我假设您使用的是自定义错误处理程序来发出错误消息

我对XDebug不太了解,但据我所知,它注册了自己的错误处理程序,在这个过程中可能会覆盖您的错误处理程序:

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

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


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

Nonono,我不发出任何东西!每当发生错误时,我希望PHP将代码设置为500,不管是我自己触发的还是解析或运行脚本时出错的。即使对于生产,我不会激活它,但在启用XDebug时,我无法使用脚本,因为状态代码已损坏,这意味着我可以使用“发布”配置文件进行测试,也可以在没有XDebug的情况下进行调试。我没有任何自定义错误处理程序,为什么您认为我有一个呢?:-)佩卡,我发现有人在和我完全相同的问题上表达得比我好得多:我想知道从那以后这个问题是否得到了解决。我的意思是,这家伙是不是完全正确@amn很有趣,当然是一个很好的观点!但您目前是如何使PHP发出500错误的?是否有INI设置?不,这就是问题所在-显然,自从链接帖子发布以来,PHP开发人员已经开始意识到这一点,因为我的PHP(5.3.2)确实将HTTP代码的错误设置为500。但一旦我启用了XDebug,不管发生什么,它都会回到200 OK。我现在已经禁用了XDebug,并使用一个定制的错误处理程序来打印堆栈(不管怎样,我在XDebug中所需要的一切)。也许我会编辑原始问题以反映更改。我问了一个问题: