buffer是一個內存地址空間,Linux系統默認大小通常爲4096(4kb),即一個內存頁。主要用於存儲速度不一樣步的設備或者優先級不一樣的設備之間傳辦理數據的區域。經過buffer,可使進程這間的相互等待變少。這裏說一個通俗一點的例子,你打開文本編輯器編輯一個文件的時候,你每輸入一個字符,操做系統並不會當即把這個字符直接寫入到磁盤,而是先寫入到buffer,當寫滿了一個buffer的時候,纔會把buffer中的數據寫入磁盤,固然當調用內核函數flush()的時候,強制要求把buffer中的髒數據寫回磁盤。php
一樣的道理,當執行echo,print的時候,輸出並無當即經過tcp傳給客戶端瀏覽器顯示, 而是將數據寫入php buffer。php output_buffering機制,意味在tcp buffer以前,創建了一新的隊列,數據必須通過該隊列。當一個php buffer寫滿的時候,腳本進程會將php buffer中的輸出數據交給系統內核交由tcp傳給瀏覽器顯示。因此,數據會依次寫到這幾個地方:echo/print -> php buffer -> tcp buffer -> browsernginx
php output_buffering
默認狀況下,php buffer是開啓的,並且該buffer默認值是4096,即4kb。你能夠經過在php.ini配置文件中找到output_buffering配置.當echo,print等輸出用戶數據的時候,輸出數據都會寫入到php output_buffering中,直到output_buffering寫滿,會將這些數據經過tcp傳送給瀏覽器顯示。你也能夠經過ob_start()手動激活php output_buffering機制,使得即使輸出超過了4kb數據,也不真的把數據交給tcp傳給瀏覽器,由於ob_start()將php buffer空間設置到了足夠大。只有直到腳本結束,或者調用ob_end_flush函數,纔會把數據發送給客戶端瀏覽器。apache
implicit_flush = off
output_buffering = off瀏覽器
默認狀況下,php buffer是開啓的,並且該buffer默認值是4096,即4kb。你能夠經過在php.ini配置文件中找到output_buffering配置.當echo,print等輸出用戶數據的時候,輸出數據都會寫入到php output_buffering中,直到output_buffering寫滿,會將這些數據經過tcp傳送給瀏覽器顯示。你也能夠經過ob_start()手動激活php output_buffering機制,使得即使輸出超過了4kb數據,也不真的把數據交給tcp傳給瀏覽器,由於ob_start()將php buffer空間設置到了足夠大。只有直到腳本結束,或者調用ob_end_flush函數,纔會把數據發送給客戶端瀏覽器。服務器
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('X-Accel-Buffering: no');tcp
function foo() { header( 'Content-Type: text/event-stream' ); header( 'Cache-Control: no-cache' ); header( 'X-Accel-Buffering: no' ); $i = 0; do { echo $i . "\n"; $i ++; ob_flush(); flush(); //ob_end_flush(); sleep( 1 ); } while ( $i < 1000 ); exit( 'done' ); }