什麼是輸出緩衝?
摘自stackoverflow的一段回答
如果沒有輸出緩衝(預設值),當PHP通過您的指令碼處理時,您的HTML將被分批傳送到瀏覽器。使用輸出緩衝,您的HTML儲存在變數中,並在指令碼末尾作為一個整體傳送到瀏覽器。
Web開發人員的輸出緩衝優勢
單獨啟用輸出緩衝會減少下載和呈現HTML所需的時間,因為當PHP處理HTML時,它不會被分批傳送到瀏覽器。
我們可以用PHP字串做的所有花哨的東西,我們現在可以將整個HTML頁面作為一個變數。
ob_flush
先看看官網說的
ob_flush 輸出緩衝區中的內容(如果裡邊有內容的話)這裡說的緩衝區就是php本身的buffer ,buffer的開啟可以看php.ini
開啟後預設的大小為4096個位元組
也就是說當我們用php 進行echo ,print_r的時候資料是不會立馬輸出到瀏覽器的,而是快取在php的buffer裡面
flush - 重新整理輸出緩衝
重新整理PHP程式的緩衝,而不論PHP執行在何種情況下(CGI ,web伺服器等等)。該函式將當前為止程式的所有輸出傳送到使用者的瀏覽器。
flush() 函式不會對伺服器或客戶端瀏覽器的快取模式產生影響。因此,必須同時使用 ob_flush() 和flush() 函式來重新整理輸出緩衝。
於是乎得到的一個總結:php輸出緩衝啟用後,php會把輸出的內容儲存在buffer裡面,但是如果使用ob_flush,flush 的話則會強制把內容輸出到客戶端
於是實踐以下 ,每個一秒輸出下時間
ob_start();//輸出緩衝啟用
for ($i=3; $i>0; $i--)
{
echo date("Y-m-d H:i:s")."<br/>";
ob_flush();
flush();
sleep(1);
}
通過瀏覽器觀看,結果並沒能像預期的沒秒輸出一次,而是等迴圈結束一起輸出了
繼續看官方文件
嗯!個別web伺服器也有自己的buffer,有些瀏覽器也有自己的顯示規則
如圖
嗯嗯,如此那麼我稍微改下以上PHP程式碼,因為預設的輸出緩衝是4096位元組,那麼在輸出當前時間前輸出4096位元組這樣就能刷出輸出緩衝了
ob_start();
$str = "";
for($j=1;$j<4096;$j++)
{
$str .=" ";
}
for($i=0;$i<10;$i++){
sleep(1);
echo $str; //先輸出4096個位元組
echo date("Y-m-d H:i:s")."<br/>\n";
flush();
ob_flush();
}
為了避免瀏覽器帶來的影響,於是php-cli模式下執行上面的php程式碼,果然能能每秒列印一次時間了,如果註釋ob_flush,flush則要等迴圈結束才一次列印出來
總結:輸出緩衝的流程 php buffer -> web Server buffer -> 瀏覽器的buffer,php啟用輸出緩衝後,輸出的內容將會儲存在buffer裡面,然後一次輸出到客戶端
本作品採用《CC 協議》,轉載必須註明作者和本文連結