【问题标题】:HTTP status header on PHP fatal error, code propositionPHP 致命错误上的 HTTP 状态标头,代码命题
【发布时间】:2012-11-30 11:38:39
【问题描述】:

如果出现 php 致命错误(用于处理 AJAX 请求),我试图弄清楚如何将 HTTP 状态标头设置为 500。

相关问题:How can I get php to return 500 upon encountering a fatal exception?

我不想使用register_shutdown_function,我认为这不是一个优雅的解决方案。

下面的代码是一个好的解决方案吗?

它是否总是适用于致命错误?

我假设应用程序代码在最后一次 echo 调用之前没有输出,并且没有对 flush() 函数的调用(调用后会阻止修改标头)。

<?php

set_status_code(500);

// ...
// (application code with no output)

// Application didn't crash up to this point,
// so we set http status code 200.
set_status_code(200);

echo $outputBuffer;

flush() 是唯一破坏预期行为的函数吗?

【问题讨论】:

  • ..为什么会出现致命错误?
  • 如果 PHP 彻底崩溃,Apache(或您选择的网络服务器)应该自动返回 500。
  • @deceze 这是 Xdebugs 错误。禁用后它就可以工作了(related)。
  • 我同意@MrCode。我认为明确设置错误 500 是不好的做法。当您遇到致命的服务器错误时,应生成 500 错误——即服务器软件已崩溃、配置错误或由于某种原因无法运行。它不应用作已运行而未崩溃的软件的错误代码。与 MrCode 一样,我更喜欢在您的 Ajax 响应中使用响应代码,但如果您必须使用 HTTP 响应代码,则 400 范围的错误代码比 500 代码更合适。
  • 如果程序还在运行,那么这个错误不是致命的。根据定义,如果您的程序能够设置 http 代码,那么代码 500 并不合适。

标签: php


【解决方案1】:

如果您关闭 PHP 错误,每当发生致命的 PHP 错误时,Apache 都会给出 500 状态码。

【讨论】:

  • &lt;?php ini_set("display_errors", "off"); throw new Exception("lolwut"); 在 Apache 上没有给出 500 状态码。我该如何完成这项工作?
  • FireBug,Fiddler2。好的,我想通了。 Xdebug 是问题所在(检查this out)。谢谢! :)
  • 在 PHP 5.4 Xdebug 显示错误 500 并且工作正常。相关:php/xdebug bug.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多