2012-11-23 79 views
1

我有一個運行在IIS 7.5上的php應用程序,php以5.4的速度運行。該應用程序工作得很好,除了長時間運行的PHP腳本似乎掛起的例外,沒有500錯誤,他們似乎從來沒有完成,並將結果返回給瀏覽器。長時間運行的php/fastcgi腳本掛在IIS 7.5上

我下面寫一個簡單的測試腳本,以消除在主應用程序編程錯誤的可能性:

<?php 
/* test timeout */ 
/*set_time_limit(110);*/ 
echo "Testing time out in seconds\n"; 
for ($i = 0; $i < 175; $i++) { 
    echo $i." -- "; 

    if(sleep(1)!=0) 
    { 
     echo "sleep failed script terminating"; 
     break; 
    } 
} 

?> 

如果我跑超越175秒它掛起腳本。在此之下它會將結果返回給瀏覽器。

以下是我爲php和fastcgi設置的超時參數。我也玩過這些設置非常低,爲了得到各種超時錯誤,並已成功,這使我得出結論,有另一個設置,我失蹤..也許。

糾正我,如果我的推定是錯誤的,但如果一個腳本超時瀏覽器將得到一個錯誤,就好像一個腳本在完成之前被IIS關閉然後沒有任何返回到瀏覽器就瀏覽器而言,你會得到一個看似懸掛的東西嗎?

的FastCGI

activity timeout=800 Idle Timeout = 900 request Timeout 800 

max_execution_time=700 
+0

感謝您的幫助格式和標籤j0k :) – Rich

回答

1

如果長時間運行的腳本不與​​瀏覽器進行通信,180秒後,使大多數瀏覽器將不響應的服務器返回結果。服務器腳本沒有掛起或被終止,而是瀏覽器(即ff和chrome)變得沒有響應。

爲了檢查這個,我運行了腳本並觀察了請求的狀態。 IIS管理器 - >選擇服務器 - >選擇工作進程(中央窗格) - >選擇應用程序池 - >選擇查看請求(右側窗格)並觀察狀態和時間流逝的列。您將不得不重複點擊「全部顯示」以查看更新值。

狀態從ExecuterequestHandler更改爲發送響應,然後腳本完成,因爲它應該,但瀏覽器仍然看起來像他們正在等待服務器響應。

我更新了我的測試腳本從上面這確保瀏覽器有規律地被送入反應:

<?php 
@ini_set("output_buffering", "Off"); 
@ini_set('implicit_flush', 1); 
@ini_set('zlib.output_compression', 0); 
@ini_set('max_execution_time', 800); 


header('Content-type: text/html; charset=utf-8'); 


echo "Testing time out in seconds\n"; 
for ($i = 0; $i < 600; $i++) { 
    echo $i." -- "; 

    if(sleep(1)!=0) 
    { 
     echo "sleep failed script terminating"; 
     break; 
    } 
    flush(); 
    ob_flush(); 
} 

?> 

輸出was't回來的瀏覽器位買位,因爲它應該和問題依然存在。

下一步,我看了看服務器上的響應緩衝。該設置被設置爲非常高的數字,意味着沖洗不起作用。所以,我在PHP flush stopped flushing in IIS7.5

設置ResponseBufferLimit 0按照由@Dario提供的說明這個問題解決了:)如果這個解決方案能夠幫助您,請訪問上面的問題,從我請給達里奧另一個+1,也許一個給他的問題和腳本的OP。

謝謝