2016-01-07 78 views
0

我有一個腳本並嘗試發送分塊數據。 爲此我在php.ini中禁用output_buffering無法將數據分塊發送到瀏覽器

output_buffering=off 
現在

當我運行我的腳本:

echo "stream1"; 
sleep(5); 
echo "stream2"; 

它顯示腳本全部執行後的整個輸出,而不是先發送流1 stream2等待瀏覽器5秒後。

+1

我MOT一個PHP開發人員,但它是有意義的。它是一個後端腳本,它在服務器上工作,其工作方式是執行腳本並將結果發送給客戶端。如果你想一個接一個地發送你的數據,你需要你的客戶端向服務器發送請求,你的腳本應該發送一部分數據來響應你的請求。 – john

+1

1.你需要flush()來實際發送輸出,2.你不能保證瀏覽器實際上決定立即顯示接收的所有內容。 – arkascha

+0

正如你所建議我試圖回聲「stream1」;沖洗();但它仍然在一起顯示stream1stream2。 – Curious

回答

0

嘗試如下:

<?PHP 
ob_start(); 

echo 'Output one.'; 
ob_flush(); 
sleep(5); 
echo 'Output two.'; 
ob_flush(); 
?> 

我覺得它更是一個HTTP請求/響應的問題。在命令行上,腳本工作正常。

正常情況下,響應已準備完畢併發送給客戶端。如果您的響應的大小必須發送多個tcp包,則可能會在腳本準備好處理之前發送第一個包。所以它取決於輸出的大小。根據客戶端/網絡瀏覽器的不同,在完整的響應到達客戶端之前,也可能會發生第一個包被渲染的情況。

嘗試下面的腳本:

header('Content-type: text/html; charset=utf-8'); 
header("Cache-Control: no-cache, must-revalidate"); 
header ("Pragma: no-cache"); 
set_time_limit(0); 
ob_implicit_flush(1); 
for ($i = 0; $i < 10; $i++) { 
    $randSlp=rand(1,3); 
    echo "Sleeping for ".$randSlp." second. ";; 
    sleep(1); 
    if(ob_get_level()>0) 
     ob_end_flush(); 
} 
+0

但首先請告訴我,我應該在嘗試腳本之前在php.ini中啓用output_buffering。 – Curious

相關問題