2012-05-19 47 views
2

給出下面的腳本爲什麼當'display_errors'打開時,此語法錯誤返回HTTP錯誤500?

<?php 

ini_set('display_errors','On'); 
error_reporting(E_ALL); 

thisisanerror 

?> 

我得到預期的

Notice: Use of undefined constant error - assumed 'error' in /htdocs/test.php on line 8 

但如果我添加了一些腳本

<?php 

ini_set('display_errors','On'); 
error_reporting(E_ALL); 

error 

function test() { 

    echo('test'); 

} 

?> 

我得到

HTTP Error 500 (Internal Server Error): An unexpected condition was encountered while the server was attempting to fulfill the request. 

爲什麼在後一種情況下我得到500錯誤而不是正常的語法錯誤?不應該display_errors總是顯示錯誤?

+2

有更多的代碼? –

+2

是的,嘗試發佈所有標籤。可能是影響結果並且看不見的東西。到目前爲止 - 沒有其他的想法:/ –

+1

第一個代碼示例是否真的說「thisisanerror」還是隻是說「錯誤」?錯誤消息提示後者。 – octern

回答

6

第二個代碼示例是一個徹頭徹尾的語法錯誤。這意味着PHP不會進展到代碼執行點,並且會在解析時死掉。由於沒有執行代碼,因此不會顯示ini_set()調用的效果,因此您不會收到指示問題的PHP文本錯誤。

解析錯誤是致命的,Web服務器(正確)設置爲使用500響應代碼處理PHP致命錯誤。由於您的PHP腳本沒有產生任何輸出,因此Web服務器將返回500條件的默認錯誤文檔。

如果您想在瀏覽器中看到解析錯誤的文本消息 - 而且通常情況下不會生產,那麼您需要在php.ini中打開錯誤報告或使用。 htaccess文件。

+0

在這種情況下錯誤只是'錯誤'後缺少分號嗎? – octern

+0

@octern是的,它會[似乎](http://codepad.org/CZrmW2ZT)[so](http://codepad.org/l9mCthpF)... – DaveRandom

+0

謝謝;我只是添加完全有效的代碼改變了現有的錯誤,從可恢復到不可恢復的事實讓我感到困惑。我想這是一個特例,因爲'error'以前是在文件的末尾。 – octern

2

如果強迫PHP上顯示運行時錯誤不爲你工作,你可以嘗試其他選項,如在php.ini中設置它,而不是:

error_reporting = E_ALL | E_STRICT 
display_errors: On 

祝您好運!