2010-08-05 54 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