緩衝(buffer)是為了協調吞吐速度相差很大的裝置之間資料傳送而採用的技術,用來存放緩衝資料的地區叫緩衝區,在電腦科學領域,當資料從一個地方傳送到另一個地方時,緩衝區被用來臨時儲存資料。與緩衝相似的一個技術是緩衝(cache),它們都是為瞭解決資料存放區和傳輸速度不同而帶來的問題,不同的是,緩衝主要在寫時使用,而緩衝主要用來在讀時使用。
如,是一個簡易的緩衝區類比圖,左端入口的資料具有單個輸入體積小,速度快,數量多,但右端輸出資料具有體積大,速度慢的特點。如果沒有緩衝區,很容易造成資料堵塞,有了緩衝區之後,當資料填滿緩衝區,再統一輸出,則可以大大減少系統負擔。
PHP在執行的過程中,嵌入的HTML代碼,’echo’,’print_r’等指令都是一次資料輸出,正是因為有緩衝區的存在,系統可以在php執行完之後再一次把資料發送給瀏覽器,運行如下代碼:
標題
發現瀏覽器是同時顯示所有內容,而不是先顯示第一行和第二行資料,等待5秒後再顯示後面的資料。不僅這樣,PHP的緩衝區還提供給我們更加強大的功能,我們可以在資料發送之前對其作出捕獲,更改等。PHP提供給我們”ob_”系列函數,例如如下代碼,可以對某些字元進行替換:
上面中的ob_start,ob_get_contents,ob_end_clean分別用來開啟使用者緩衝區,擷取緩衝內容和關閉緩衝區,PHP中所有的輸出控制函數有:
flush — 重新整理輸出系統緩衝
ob_clean — 清空(擦掉)輸出緩衝區
ob_end_clean — 清空(擦除)緩衝區並關閉輸出緩衝
ob_end_flush — 沖刷出(送出)輸出緩衝區內容並關閉緩衝
ob_flush — 沖刷出(送出)輸出緩衝區中的內容
ob_get_clean — 得到當前緩衝區的內容並刪除當前輸出緩。
ob_get_contents — 返回輸出緩衝區的內容
ob_get_flush — 刷出(送出)緩衝區內容,以字串形式返回內容,並關閉輸出緩衝區。
ob_get_length — 返回輸出緩衝區內容的長度
ob_get_level — 返回輸出緩衝機制的嵌套層級
ob_get_status — 得到所有輸出緩衝區的狀態
ob_gzhandler — 在ob_start中使用的用來壓縮輸出緩衝區中內容的回呼函數。ob_start callback function to gzip output buffer
ob_implicit_flush — 開啟/關閉絕對刷送
ob_list_handlers — 列出所有使用中的輸出處理常式。
ob_start — 開啟輸出控制緩衝
output_add_rewrite_var — 添加URL重寫器的值(Add URL rewriter values)
output_reset_rewrite_vars — 重設URL重寫器的值(Reset URL rewriter values)
php中,可以通過php.ini的output_buffering來設定緩衝,On表示無窮大,Off表示關閉,數字則表示緩衝區的大小(以位元組為單位),預設大小是4KB,如果設定成off,則樣本一的代碼是不是就可以分段在瀏覽器顯示了呢?答案是否定的,有兩點需要注意,第一點即使把PHP的緩衝關閉,php輸出在系統層面也有緩衝(可以理解為Linux系統stdout的緩衝),必須通過flush函數輸出;第二點是一些有些瀏覽器對一次接收的文字長度有限制,如果太少,則不予顯示。所以這樣的代碼可以分段顯示:
標題
當然在實際生產環境,直接把output_buffering關閉的情況比較少見,我們可以通過ob_系列函數來進行操作,下面的例子是利用緩衝進行伺服器推送(comet)的樣本。如下代碼可以給用戶端進行資訊推送:
參考資料
-
Output Control 函數
-
關於php_buffering的疑問