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

mutmk8jj  于 2023-10-23  发布在  Apache
关注(0)|答案(1)|浏览(112)

我运行Apache 2.2.15与PHP 5.3.2,'display_errors' disabled,'display_startup_errors' disabled,'log_errors' enabled.
在我的设置中(所以我认为这是一种规范),PHP在致命错误时中止,这很好,并将HTTP状态代码设置为500。致命错误包括E_ERROR、E_PARSE、E_CORE_ERROR、E_COMPILE_ERROR、E_USER_ERROR,可能还有E_RECOVERABLE_ERROR(我自己不能触发它,所以不能轻易检查发生了什么)。我认为它确实将代码设置为500是一个好主意,因为我认为这是正确的做法-显然,如果您的脚本包含语法错误和/或未能在运行时完成应该做的事情,这是一个服务器错误,如果我们认为PHP是服务器的一部分。

现在,这是重要的部分:

无论如何,我现在已经安装了Xcovery来更好地跟踪错误,但是我现在可以看到,无论错误是什么,即使脚本像以前一样在致命错误时中止,* HTTP状态代码总是200*。这打破了我通过HTTP与Apache/PHP“对话”的客户端:|
此外,将display_errors设置为On/1,使PHP不再将HTTP状态代码设置为500,并表现出与上面的Xcovery完全相同的行为。
我非常依赖于可靠的状态码行为在这里,这一切都让我相信这是某种侥幸或随机像天气..还是我错过了什么

更新

有一篇博客文章概述了这个问题:http://talideon.com/weblog/2008/02/php-errors.cfm
就我而言,我已经禁用了Xcovery,因为它是导致不良行为的原因。我只是将其用于堆栈跟踪,现在使用自定义错误处理程序来代替它。此外,链接的文章是从2008年,显然PHP设置HTTP状态码自动为500这些天。在这里也是如此。当然,如果没有Xiamen。

k4ymrczo

k4ymrczo1#

我假设您正在使用自定义错误处理程序来发出500。
我不太了解Xcovery,但根据this article,它注册了自己的错误处理程序,可能会在过程中覆盖您的错误处理程序:
请注意,如果使用register_error_handler()定义自定义错误处理程序,则xdebug的扩展错误显示不起作用。这是因为xdebug在内部使用相同的机制。如果您的脚本使用自定义错误处理程序,您仍然可以使用函数xdebug_get_function_stack()在自定义错误处理程序中输出堆栈跟踪。
但是,对于生产使用,您无论如何都不会激活Xcovery,是吗?
至于为什么当你激活display_errors()时输出200,我不明白。你能发布你的自定义错误处理函数来看看吗?

相关问题