在控制檯中運行PHP腳本時,該腳本的所有標準輸出文本都會在腳本運行時顯示在控制檯窗口中。瀏覽器窗口是否可以在運行冗長的PHP腳本的同時在瀏覽器中接收狀態報告,而不是在腳本結尾處獲取所有輸出結果?Web服務器是否可以使用擴展的輸出時間流來響應HTTP請求?
回答
是的。只需定期調用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);
沒有工作。在[this](http://pastebin.com/LzeTUnzi)代碼中,我在加載開始之前調用[this](http://pastebin.com/27qkdkYD)函數,因此用戶不應該儘快看到此文本瀏覽器加載地址? – Hubro 2011-04-18 22:38:35
奇怪的是,我嘗試了一些簡單的例子,看起來Google Chrome只在收到至少一個換行符後纔開始顯示輸出(flush()的手冊頁也提到了一些瀏覽器在顯示之前至少需要256字節的數據)。在flush之前嘗試添加一個換行符(也許是一些填充)。 – 2011-04-18 22:49:02
我想說Chrome也有256字節的要求。輸出任何東西的唯一情況是,當我收到有關'ob_flush'沒有做任何事情的冗長警告時。 – Hubro 2011-04-18 22:55:57
是的,有一件事你不用擔心,如果你有特別長的執行時間超時。這可能發生爲PHP超時或瀏覽器超時(通常大約2分鐘)。
這個關於connection handling的PHP文檔有很多關於保持連接活着的好消息。
- 1. 是否可以向透明代理髮出HTTP請求,並接收來自上游服務器的響應?
- 2. 實現HTTP服務器 - 是否必須響應所有請求?
- 3. http請求花費太長時間等待服務器響應
- 4. 如何測量服務器端HTTP請求和HTTP響應之間的時間?
- 5. Web服務器帶寬是否包含整個HTTP請求/響應?
- 6. 是否可以使用webbrowser屬性來發出http請求?
- 7. 在.NET中使用HTTP請求響應消費Web服務?
- 8. Cucumber/Ruby:是否可以攔截來自瀏覽器的HTTP請求/響應?
- 9. 跟蹤來自Web服務器的傳出HTTP請求
- 10. 使用tomcat我可以檢查我的HTTP請求是否是對我的Web服務有效的請求?
- 11. 如何構建Firefox擴展來攔截HTTP請求和響應?
- 12. 來自HTTPS和HTTP Web服務的響應時間
- 13. Websphere Web服務器減緩我的輸出流響應
- 14. WCF服務 - HTTP請求和響應
- 15. 請求:檢查代理服務器是否被用來製作HTTP請求
- 16. 是否可以在POST命令後忽略來自Web服務器的響應?
- 17. Apache HTTP Web服務器請求
- 18. Web服務器shell腳本可以使用標準輸入/輸出來提供多個請求嗎?
- 19. HTTP 1.1服務器如何響應HTTP 1.0請求?
- 20. 是否可以使用Python來測量響應時間?
- 21. 是否可以通過Web請求確定用戶時間?
- 22. 使用httpcomponents處理流式響應時的多個http請求
- 23. 如何測量服務器的請求和響應時間?
- 24. HttpCore的HTTP請求/響應的流程
- 25. 我可以作爲HTTP請求調用Web服務嗎?
- 26. 你可以向HTTP服務器發出HTTPS請求嗎?
- 27. 從Web服務器向CGI/FastCGI流程發送HTTP請求
- 28. 擴展.json的Http請求
- 29. 帶出HTTP請求的HTTP響應
- 30. C#Web請求/服務器不可用錯誤/ HTTP頭
當然,只要腳本關閉輸出緩衝,然後定期輸出狀態消息。只要服務器不重寫緩衝區刷新請求,就會在客戶端看到這些消息。但是......至多緩衝區刷新/覆蓋只是對服務器和底層操作系統的建議,即緩衝區應該被刷新。 – 2011-04-18 22:12:23