我有一個腳本並嘗試發送分塊數據。 爲此我在php.ini中禁用output_buffering無法將數據分塊發送到瀏覽器
output_buffering=off
現在
當我運行我的腳本:
echo "stream1";
sleep(5);
echo "stream2";
它顯示腳本全部執行後的整個輸出,而不是先發送流1 stream2等待瀏覽器5秒後。
我有一個腳本並嘗試發送分塊數據。 爲此我在php.ini中禁用output_buffering無法將數據分塊發送到瀏覽器
output_buffering=off
現在
當我運行我的腳本:
echo "stream1";
sleep(5);
echo "stream2";
它顯示腳本全部執行後的整個輸出,而不是先發送流1 stream2等待瀏覽器5秒後。
嘗試如下:
<?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();
}
但首先請告訴我,我應該在嘗試腳本之前在php.ini中啓用output_buffering。 – Curious
我MOT一個PHP開發人員,但它是有意義的。它是一個後端腳本,它在服務器上工作,其工作方式是執行腳本並將結果發送給客戶端。如果你想一個接一個地發送你的數據,你需要你的客戶端向服務器發送請求,你的腳本應該發送一部分數據來響應你的請求。 – john
1.你需要flush()來實際發送輸出,2.你不能保證瀏覽器實際上決定立即顯示接收的所有內容。 – arkascha
正如你所建議我試圖回聲「stream1」;沖洗();但它仍然在一起顯示stream1stream2。 – Curious