簡體   English   中英

長時間運行的php / fastcgi腳本在IIS 7.5上掛起

[英]Long running php/fastcgi script hangs on IIS 7.5

我有一個在IIS 7.5上運行的php應用程序,以fastcgi運行的php 5.4。 該應用程序絕對可以正常工作,但長時間運行的php腳本似乎掛起了。 沒有500錯誤,它們看起來似乎永遠不會完成,並將結果返回到瀏覽器。

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

<?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

如果長時間運行的腳本無法與瀏覽器通信,則在180秒左右后,大多數瀏覽器將對服務器返回結果無響應。 服務器腳本沒有掛起或終止,而是瀏覽器(即ff和chrome)變得無響應。

為了檢查這一點,我運行了腳本並觀察了請求的狀態。 IIS管理器->選擇服務器->選擇工作進程(中央窗格)->選擇應用程序池->選擇查看請求(右側窗格),並觀察狀態和經過的時間列。 您將不得不反復單擊“全部顯示”以查看值更新。

狀態從ExecuterequestHandler更改為Sending response,然后腳本按原樣完成,但瀏覽器仍然看起來像他們在等待服務器響應。

我從上面更新了我的測試腳本,以確保定期向瀏覽器反饋響應:

<?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();
}

?>

輸出結果並沒有回到瀏覽器的應有盡有,問題仍然存在。

下一步,我研究了服務器上的響應緩沖。 該設置被設置為一個很高的數字,這意味着沖洗將不起作用。 所以我按照@Dario在PHP flush中提供的說明將ResponseBufferLimit設置為0, 在IIS7.5中停止了刷新

這樣就解決了問題:)如果此解決方案對您有幫助,請訪問上面的問題,並請Dario再給我+1,也許還有一個給OP詢問他的問題和腳本。

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM