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

标签 php apache http xdebug

我正在运行带有 PHP 5.3.2 的 Apache 2.2.15,“display_errors”被禁用,“display_startup_errors”被禁用,“log_errors”被启用。

在我的设置中(所以我认为这是一种规范),PHP 会在出现 fatal error 时中止,这很好,并且将 HTTP 状态代码设置为 500。 fatal error 包括 E_ERROR、E_PARSE、E_CORE_ERROR、E_COMPILE_ERROR、E_USER_ERROR 和可能的 E_RECOVERABLE_ERROR(我自己无法触发它,因此无法轻易检查发生了什么)。我认为将代码设置为 500 是一个好主意,因为我认为这是正确的做法 - 显然,如果您的脚本包含语法错误和/或未能执行在运行时应该执行的操作,那么它是服务器错误,如果我们将 PHP 视为服务器的一部分。

现在,这是重要的部分:

无论如何,我现在已经安装了 XDebug 以更好地跟踪错误,但我现在可以看到,无论错误如何,即使脚本像以前一样因 fatal error 而中止,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。

最佳答案

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

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

Please note that the extended error display of xdebug does not work if you define a custom error handler using register_error_handler(). This is because xdebug internally uses the same mechanism. Should your scripts use a custom error handler, you can still use the function xdebug_get_function_stack() to output the stack trace in your custom error handler.

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

至于为什么激活display_errors()时输出200,我不明白。您可以发布您的自定义错误处理函数以供查看吗?

关于php - 如何让 PHP 在出现任何错误情况时自动将 HTTP 状态代码设置为 500? (包括用户无法处理的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3075174/

相关文章:

api - Eventbrite API 列出事件 403

php - 初学者...对同一函数中的同名变量感到困惑

javascript - 单击时从其他具有相同名称的类中隐藏一个类

php - 如何处理来自 csv 的空日期以插入 db

Apache-.htaccess

php - 在 Windows 10 操作系统上的 XAMPP 安装设置中,我在哪里可以找到 PHPIniDir 指令及其值?

apache - 如何在centos中使用环境变量覆盖文件中的值

php - Laravel:在哪里抛出 HTTP 异常

http - 服务器端相当于 ClientTrace 中的 go

php - mysql 不喜欢我的语句