6

我正在开发一个 PHP 应用程序,它使用 HTTP 响应代码进行通信以及响应主体。所以这是 PHP 代码中的一个典型场景:

try {
    doSomething();
}
catch (Exception $e) {
    header('HTTP/1.1 500 Internal Server Error');
}

...客户端中的典型代码如下所示:

switch(responseCode) {
     case 200 :
         // all fine
         // ....
     case 500 :
         // trouble!
 } 

这很酷,只要在 PHP 代码中很好地捕获每个错误。

问题:如果由于任何原因在 php 代码中发生未捕获的错误或无法捕获的错误(如语法错误),Apache 将发送 200 OK。但我不想让 apache 说 500 Internal Server Error。也许每个 .htaccess 左右。

4

3 回答 3

2

当然,您可以编写自己的错误处理程序。但是,并非所有 PHP 错误都是可捕获的。例如,语法错误甚至不允许您的代码运行,包括您的错误处理程序。

要处理可捕获的错误,您可以使用auto_append_fileauto_prepend_file指令来放置错误处理代码代码。

不可捕获的错误是一个不同的问题。如果 PHP 作为Fast CGI运行,它会自动为您生成 500 状态码。但是,您可能正在通过其他一些 SAPI(例如 Apache 模块)运行 PHP。对此一无所知,抱歉。(如果我发现了什么,我会回来报告。)

于 2010-08-05T08:02:09.360 回答
2

在 PHP回显响应正文的第一个字节之前,不会发送响应标头。您可以同时更改标题(和状态代码)。记住这一点,这里有一个解决方案:

500将您的脚本设置为在脚本的开头和200结尾发送响应代码。这是一个例子:

header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error');

if (rand(0, 1) == 1) {
    die("Script terminated prematurely");
}

header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');
echo "Success";

只需确保200响应代码仅设置在代码中的一个位置即可。

注意:您可以使用http_response_code(PHP >= 5.4) 代替header.

于 2013-01-08T10:01:39.173 回答
2

现在它不再是一个问题 - 因为 5.3 PHP 终于学会了在错误时发送 503,而不是 200

呃,好像是5.2.4

更改了错误处理程序以发送 HTTP 500 而不是 PHP 错误的空白页。

您需要设置display_errors = off以使其工作

我在我的 Windows Apache 2.4 和 PHP 5.4.5 上有确切的行为

于 2013-01-08T10:09:26.540 回答