2017-06-03 63 views
-1

我正在通過命令行像這樣在phpPHP shell腳本不會等待完成過程

echo "first sentence"; 
sleep(5); 
echo "second sentence"; 

當CMD運行,其打印第一句,5秒鐘後,打印第二句。但是當我跑到網絡瀏覽器時,它等待完成這個過程。爲什麼這發生在cmd?任何想法?

+0

所有你需要做的就是在sleep()之前調用'flush()',但它不能保證任何東西。 Web服務器本身和任何代理服務器都可以在將其發送回客戶端之前等待整個內容(或至少其中的一部分)生成。沒有辦法說服他們按你的意願工作。 – axiac

回答

-1

最後我找到了答案。這是很好的用於調試目的:

@ini_set('zlib.output_compression', 1); 
@ini_set('implicit_flush', 1); 
@ob_end_clean(); 
set_time_limit(0); 
ob_implicit_flush(1); 
ob_end_flush(); 

echo "first sentence"; 
sleep(5); 
echo "second sentence"; 

ob_start(); 
+0

腳本末尾的ob_start()的用途是什麼?無論如何,輸出緩衝不涉及這個過程。 – axiac

0

cmd運行,其打印第一句話,5秒鐘後,打印第二句。但是當我跑到網絡瀏覽器時,它等待完成這個過程。爲什麼會發生這種情況cmd?

它發生在使用CLI運行腳本時,因爲這是您要求它執行的操作。 當它由Web服務器調用時它的工作原理是一樣的。

區別在於,當您在終端中運行它時,沒有中間過程。 PHP解釋器產生一些輸出,終端將顯示它。

爲了優化目的,一旦PHP腳本產生數據,Web服務器就不會將數據發送回瀏覽器(可能是地球的一半)。它會將它放入緩衝區,並在PHP腳本結束或緩衝區已滿時將其發送到瀏覽器。

PHP解釋器本身使用這樣的緩衝區來輸出。

您可以通過調用flush()(例如,在每個echo之後)強制PHP發送生成的輸出。 但是,這並沒有解決任何問題。

PHP解釋器將輸出發送到Web服務器,但Web服務器有其自己的緩衝機制,無法通過PHP腳本進行控制。 更多的是,即使Web服務器將輸出發送回瀏覽器,瀏覽器也會決定是使用數據更新已經呈現的頁面,還是等待更多數據(或連接關閉)。

更重要的是,如果瀏覽器和服務器之間有代理服務器,他們通常會實現自己的緩衝機制,無法以任何方式說服其緩衝區。