2011-08-29 88 views
1

我查找過類似的主題,但似乎沒有解決我目前遇到的問題。 我有此JavaScript:AJAX請求PHP腳本循環

<script type="text/javascript"> 

       http = new XMLHttpRequest(); 

       function fetch() 
       { 

        http.open("GET", "script.php", true); 
        http.onreadystatechange = useHttpResponse; 
        http.send(null); 

       } 

       function useHttpResponse() 
       { 

        if(http.readyState == 4) 
        { 

          var textout = http.responseText; 
          document.getElementById("ajax").innerHTML=textout; 

        } 

       } 

</script> 

非常基本的東西。 PHP腳本是一個簡單的循環:

for($i = 0; $i < 30000; $i++) 
{ 

     echo 'Hello<br />'; 

} 

這很好。我按下一個具有onClick="javascript:fetch()"的按鈕,它會請求PHP腳本並在id爲「ajax」的div中輸出30.000行「Hello」。

問題是它必須等到運行了所有30.000循環。我希望它在EACH循環後通過AJAX請求輸出響應,以便在腳本運行時擴展列表類型。這可能嗎?我將如何做到這一點?就像我說的,我已經搜索過,但空着。我意識到這是嚴格的美容效果,但我會很樂意爲任何建議!

謝謝

回答

2

禁止輸出緩衝在你的PHP設置,或在每次迭代之後調用http://www.php.net/manual/en/function.flush.php。正如Mike指出的那樣。在您的XHR的onreadystatechange中,您正在檢查status == 4,這意味着所有數據都已傳輸。您應該檢查status == 3,這意味着The request is in process; often some partial data is available from the response, but the server isn't finished with its response.

邁克還指出,如果您的服務器設置爲使用壓縮,那麼所有輸出不能被緩衝,並且您不能流式處理您的HTML內容。

+1

這是行不通的。 '4'的'http.readystate'是數據傳輸完成的時候。 – Mike

+1

另外,你應該提到,如果啓用gzip壓縮,調用flush()將不起作用。 – Mike

+0

這工作奇蹟!我之前曾嘗試過刷新方法,但在腳本完成所有循環之前什麼都沒有發生。狀態設置爲3而不是4,現在它將輸出每個循環中的所有內容。 顯然,只有那個for-loop,瀏覽器凍結了,因爲發送了所有更新,但是使用我的應用程序腳本沒有更少的行數來打印(但需要更多時間運行),它運行得非常好。感謝您的快速回復! – Tanax