2011-04-18 80 views
2

在控制檯中運行PHP腳本時,該腳本的所有標準輸出文本都會在腳本運行時顯示在控制檯窗口中。瀏覽器窗口是否可以在運行冗長的PHP腳本的同時在瀏覽器中接收狀態報告,而不是在腳本結尾處獲取所有輸出結果?Web服務器是否可以使用擴展的輸出時間流來響應HTTP請求?

+0

當然,只要腳本關閉輸出緩衝,然後定期輸出狀態消息。只要服務器不重寫緩衝區刷新請求,就會在客戶端看到這些消息。但是......至多緩衝區刷新/覆蓋只是對服務器和底層操作系統的建議,即緩衝區應該被刷新。 – 2011-04-18 22:12:23

回答

4

是的。只需定期調用flush()和ob_flush()。至少每120秒輸出一次輸出以保持與瀏覽器的連接至關重要。

一個粗略的例子:

while(!$done) { 
     //doWork(); 
     echo number_format(100 * ($workDone/$workTotal)) . "% "; 
     flush(); 
     ob_flush(); 
    } 

編輯:下面是我的ENV工作理念的一個任意證明:

print('hello'); 
print(str_repeat(".\n", 2048)); 
flush(); 
//this might be a safe way to only flush the buffer if necessary? 
if(ob_get_length()) 
    ob_flush(); 
sleep(60); 
+0

沒有工作。在[this](http://pastebin.com/LzeTUnzi)代碼中,我在加載開始之前調用[this](http://pastebin.com/27qkdkYD)函數,因此用戶不應該儘快看到此文本瀏覽器加載地址? – Hubro 2011-04-18 22:38:35

+0

奇怪的是,我嘗試了一些簡單的例子,看起來Google Chrome只在收到至少一個換行符後纔開始顯示輸出(flush()的手冊頁也提到了一些瀏覽器在顯示之前至少需要256字節的數據)。在flush之前嘗試添加一個換行符(也許是一些填充)。 – 2011-04-18 22:49:02

+0

我想說Chrome也有256字節的要求。輸出任何東西的唯一情況是,當我收到有關'ob_flush'沒有做任何事情的冗長警告時。 – Hubro 2011-04-18 22:55:57

0

是的,有一件事你不用擔心,如果你有特別長的執行時間超時。這可能發生爲PHP超時或瀏覽器超時(通常大約2分鐘)。

這個關於connection handling的PHP文檔有很多關於保持連接活着的好消息。

相關問題