2010-08-05 56 views
7

我正在开发一个PHP应用程序,它使用HTTP响应代码进行通信以及响应主体。因此,这是在PHP代码的典型场景:如何让Apache在发生PHP错误时发送500?

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内部服务器错误。也许每个.htaccess左右。

+1

在我的Windows的Apache 2.4的确切行为为什么JavaScript代码? – 2010-08-05 07:50:28

+0

曾经有一个javascript客户端。删除了标签。 – hek2mgl 2013-01-08 07:22:15

+0

对不起,更新了我的答案。 – 2013-01-08 17:31:10

回答

2

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

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

不可捕捉的错误是一个不同的问题。如果PHP运行为Fast CGI,它将自动为您生成一个500状态码。但是,您可能通过其他一些SAPI(例如Apache模块)运行PHP。不知道,对不起。 (如果我发现某些东西,我会报告回来)。

+0

感谢您的快速回答! 是的,我写了一个自定义的错误和异常处理程序,但你是对的,不可捕捉的错误是问题。我正在使用此搜索结果。 – hek2mgl 2010-08-05 08:10:49

+0

无论如何,这种致命错误不会被忽视,不是吗? – 2010-08-05 08:22:45

+0

语法错误和其他致命错误不能被任何错误处理程序捕获 – stillstanding 2010-08-05 15:37:36

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

+0

不错的想法+1 :)但是如果例如(致命的)语法错误被抛出,它仍然会发送200 OK。 – hek2mgl 2013-01-08 16:36:06

+0

至少在PHP> = 5.3.19上,有语法错误的脚本会生成500错误。没有人愿意在生产服务器上拥有这样的脚本。 – 2013-01-08 17:39:17

2

如今,它没有更多的问题 - 因为5.3 PHP终于学会了在错误送503,而不是200

犯错,它似乎是5.2.4

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

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

我有PHP 5.4.5

+0

我已经使用PHP 5.3.10进行了测试。例如语法错误仍然会导致200 OK。在哪种情况下PHP会发送503? – hek2mgl 2013-01-08 16:34:07

+0

您的更新听起来不错!但它仍然不适合我。我已经使用PHP 5.3.10-1ubuntu3.4进行了测试。我用了一个简单的语法错误页面'<?错误'进行测试。 'display_errors'被禁用。我仍然得到一个空白页面和响应代码200.我使用apache2 sapi。你知道一个php版本/ web服务器组合,你可以生产500吗? – hek2mgl 2013-01-08 17:51:48

+0

@YourCommonSense,是否存在临时覆盖5.2.4行为的方法,迫使它在PHP错误上显示空白页面? – Pacerier 2013-07-22 16:22:59