buffer是一個內存地址空間,Linux系統默認大小一般為4096(1kb),即一個內存頁。主要用於存儲速度不同步的設備或者優先級不同的 設備之間傳辦理數據的區域。通過buffer,可以使進程這間的相互等待變少。這里說一個通俗一點的例子,你打開文本編輯器編輯一個文件的時候,你每輸入 一個字符,操作系統並不會立即把這個字符直接寫入到磁盤,而是先寫入到buffer,當寫滿了一個buffer的時候,才會把buffer中的數據寫入磁 盤,當然當調用內核函數flush()的時候,強制要求把buffer中的臟數據寫回磁盤。
在PHP中與刷新緩沖相關的函數有三個:
1). flush
刷新PHP程序的緩沖,而不論PHP執行在何種情況下。該函數將當前為止程序的所有輸出發送到用戶的瀏覽器。 但是該函數不會對服務器或客戶端瀏覽器的緩存模式產生任何影響,也不會對PHP本身的緩存產生任何影響。
2).ob_flush
該函數對PHP本身的的緩存進行輸出。PHP本身的緩存受php.ini中的output_buffering的控制。ob_flush()的作用就是將本來存在輸出緩存中的內容取出來,設置為等待輸出狀態,但不會直接發送到客戶端,這時你就需要先使用ob_flush()再使用flush(),客戶端才能立即獲得腳本的輸出。
3).ob_implicit_flush
這個函數強制每當有輸出的時候,即刻把輸出發送到瀏覽器。這樣就不需要每次輸出(echo)后,都用flush()來發送到瀏覽器了。
以下是舉例:
- <?php
- ob_end_clean();
- echo
str_pad(" " ,256); - for
( $i=100;$i>0; $i--) { -
echo $i, '<br/>'; -
flush(); -
sleep(1); - }
- ?>
- <?php
- echo
str_pad(" " ,256); - for
( $i=100;$i>0; $i--) { -
echo $i, '<br />' ; -
ob_flush(); -
flush(); -
sleep(1); - }
- ?>
- <?php
- ob_implicit_flush(true);
- echo
str_pad(" " ,256); - for
( $i=100;$i>0; $i--) { -
echo $i, '<br />' ; -
ob_flush(); -
sleep(1); - }
- ?>
另外我們還需要注意刷新緩沖不光受以上幾方面的影響,還受以下影響:
1). 個別web服務器程序,特別是Win32下的web服務器程序,在發送結果到瀏覽器之前,仍然會緩存腳本的輸出,直到程序結束為止。有些Apache的模塊,比如mod_gzip,可能自己進行輸出緩存,這將導致flush()函 數產生的結果不會立即被發送到客戶端瀏覽器。甚至瀏覽器也會在顯示之前,緩存接收到的內容。例如 Netscape 瀏覽器會在接受到換行或 html 標記的開頭之前緩存內容,並且在接受到 </table> 標記之前,不會顯示出整個表格。一些版本的 Microsoft Internet Explorer 只有當接受到的256個字節以后才開始顯示該頁面,所以必須發送一些額外的空格來讓這些瀏覽器顯示頁面內容。
2). PHP安裝模式的影響。以上方式對於PHP以Apache模塊方式安裝的情況,可以直接使用。
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
fastcgi_busy_buffers_size 4k
gzip off;
PHP函數說明:
2.相關flush類似函數如下