2012-07-18 58 views
0

可能重複:
what is output buffering?爲什麼PHP一次發送它?

我已經PHP所產生的一些內容需要一段時間。同時我想用這個簡單的JS技巧來顯示「加載...」消息。消息一旦生成就會消失。

<p id="loading_msg">Loading...</p> 

<h1>Hello</h1> 
<?php 
    sleep(2); // This is the greedy function call 
    print '<p>This content definitely took a while to be generated !.</p>'; 
?> 

<script type="text/javascript"> 
    var e = document.getElementById("loading_msg"); 
    e.style.display = "none"; 
</script> 

的問題是,而不是發送一切都交給sleep(2);然後阻塞,它會等待生成所有頁面之前,和然後,一下子發送。這顯然打破了我的「加載...」消息的目的,因爲它在2秒鐘之前沒有出現。任何想法爲什麼,以及我如何解決這個問題?

+0

問題已經作爲一個關於output_buffering的副本關閉了 - 但是這個問題關於在服務器完成之前獲取內容在客戶端中呈現(意味着輸出緩衝的反面) – symcbean 2012-08-01 22:55:57

回答

4

默認情況下,PHP將緩衝您的輸出並向用戶發送較少數量的較大塊。您可以使用flush來寫緩衝區的內容發送到馬上用戶:

<p id="loading_msg">Loading...</p> 

<h1>Hello</h1> 
<?php 
    flush(); 
    sleep(2); 

如果您以前通過調用ob_start或php.ini指令output_buffering1啓用輸出緩衝這將無法正常工作。

+0

我已經想到緩衝區問題。不幸的是,我在第一行添加了'ob_start()',在'sleep()'之前添加了'flush()',它仍然表現相同。 (還嘗試了與其他函數的各種組合,如'ob_flush()'或'ini_set('output_buffering','on')'。 – mdup 2012-07-18 15:34:36

+2

閱讀我的答案,它具體說這不適用於'ob_start'。然後閱讀[文檔](http://php.net/manual/en/function.flush.php),它具體說**「這意味着你將不得不調用'ob_flush()'和'flush()'刷新ob輸出緩衝區「**。 – meagar 2012-07-18 15:38:36

+0

知道了,我讀了一點快,對不起。我花了一段時間才明白'ob_ *'函數是如何相互關聯的。它確實與'ob_flush();沖洗();'。謝謝 ! – mdup 2012-07-18 16:01:35

1

使用'flush'可能適用於某些網絡服務器/瀏覽器(meagar是正確的,它在啓用輸出緩衝時不起作用 - 但這並不意味着它會在其餘時間運行)。

由網絡服務器決定何時恢復爲分塊編碼 - 只要您不壓縮輸出流,大多數情況下都會啓動分塊響應。然後,由瀏覽器決定何時開始呈現不完整的響應 - 並且行爲也將隨着內容而變化 - 例如,沒有人會開始渲染表格,直到它具有結束標記。

然後嘗試在接收頁面中處理它的一個更好的解決方案是在發送頁面中處理它 - 例如,使用litebox來顯示消息。或者,該消息可以顯示在臨時頁面中,該頁面重定向到生成的內容。

相關問題