如果出现PHP错误,如何让Apache发送500?

时间:2010-08-05 07:43:52

标签: php apache error-handling http-headers http-status-codes

我正在开发一个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。但我不想说500内部服务器错误。也许每个.htaccess左右。

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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

答案 2 :(得分:2)

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

呃,似乎是5.2.4

  

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

您需要设置display_errors = off才能使其正常工作

我在我的Windows Apache 2.4上使用PHP 5.4.5具有确切的行为