1、概念php
在PHP運行的過程當中,能夠將會產生輸出的函數或操做結果暫時保存在PHP的緩衝區,只有當緩衝區滿了、或者PHP運行完畢、或者在必要時候進行輸出,纔會將數據輸出到瀏覽器,此緩衝數據的區域稱爲PHP的輸出緩衝區(OB)。html
2、原理web
①使用了緩衝區以後,當執行PHP的時候,若是碰到了echo、print_r之類的會輸出數據的代碼(實際上許多函數都會產生輸出),PHP就會將要輸出的數據放到PHP自身的緩衝區,等待輸出;數據庫
②當PHP自身的緩衝區接到指令,指示要輸出緩衝區的內容時,將會把緩衝區內的數據輸出到服務器上, 服務器接受到PHP輸出的數據,而後再把該數據存在到服務器自身的緩衝區內,等到輸出;瀏覽器
③當服務器接受到指令,只是要輸出緩衝區的內容時, 將會把緩衝區的內容輸出,返回到瀏覽器。緩存
上面能夠看出,輸出緩衝區層不是惟一用於緩衝輸出的層,它實際上只是不少層中的一個。最後一點你要記住輸出緩衝區層的行爲跟你使用的SAPI(web或cli)相關,不一樣的SAPI可能有不一樣的行爲。服務器
第一點概念有提到,緩衝區滿了會將緩衝數據輸出,這個跟SAPI有關,緩衝區主要是經過php.ini中的output_buffering變量控制。output_buffering的默認是on,默認值是4096(4kb)。cookie
3、輸出緩衝區的配置session
一、以咱們一般使用的PHP-FPM這種SAPI爲例,這裏總結一下php的ini文件配置,主要爲三個選項:函數
output_buffering
implicit_flush
output_handler
經過一個表格來理清一下這三個參數的含義:
注意,以上三個值不能在運行時使用ini_set()改這幾個選項的值。
二、關於PHP CLI方式執行時的配置,與FPM不太同樣,有幾點須要注意的是:
(1) output_buffering參數默認是不開啓的,
(2) implicit_flush參數默認被置爲1(開啓)。
三、關於output_handler設置回調函數,可參考一下幾個經常使用設置:
①ob_gzhandler : 使用ext/zlib壓縮輸出;
②mb_output_handler : 使用ext/mbstring轉換字符編碼;
③ob_iconv_handler : 使用ext/iconv轉換字符編碼;
④ob_tidyhandler : 使用ext/tidy整理輸出的HTML文本;
⑤ob_[inflate/deflate]_handler : 使用ext/http壓縮輸出;
⑥ob_etaghandler : 使用ext/http自動生成HTTP的Etag;
4、輸出緩衝區相關方法
ob_start(); //打開一個輸出緩衝區,全部的輸出信息再也不直接發送到下一層,而是保存在輸出緩衝區裏面。
ob_clean(); //刪除內部緩衝區的內容,不關閉緩衝區(不輸出)。
ob_end_clean(); //刪除內部緩衝區的內容,關閉緩衝區(不輸出)。
ob_get_clean(); //返回內部緩衝區的內容,關閉緩衝區。
ob_flush(); //發送緩衝區內容到下一層,刪除緩衝區內容,不關閉緩衝區。
ob_end_flush(); //發送緩衝區內容到下一層,刪除緩衝區的內容,關閉緩衝區。
ob_get_flush(); //返回緩衝區的內容,並關閉緩衝區,再釋放緩衝區的內容。
ob_get_contents(); //返回緩衝區的內容,不輸出。
ob_get_length(); //返回緩衝區的長度,若是緩衝區未被激活,則返回FALSE。
ob_get_status() ; //獲得全部輸出緩衝區的狀態。
ob_implicit_flush(); //打開/關閉絕對刷送。
5、輸出緩衝區的應用
一、在session、cookie、header等設置函數以前開啓:
最多見的就是在使用header函數以前,就已經輸出了某些數據,這樣會致使某些錯誤,例如 Cannot modify header information – headers already sent by;
出現這個錯誤的緣由是, 在header以前已經輸出了某些數據,而輸出這些數據的同時, 服務器將會同時發送一個響應狀態到瀏覽器上(既然有輸出,即這個請求是有效的),而其後你又再次使用header函數
發送http頭,則會返回這個錯誤,錯誤的意思是:HTTP頭已經發送出去了,你不能對他再作修改。
所以能夠在開頭先開啓ob_start方法。
二、控制PHP程序的下載功能:
一般不少人會用PHP實現文件下載,可是當一個文件大小過大(例如100M)時,若是先所有讀入內存再傳送給用戶,會致使響應時間大大加長(甚至超時),同時內存佔用也會大大增長(甚至溢出)。
使用輸出緩衝,能夠將讀取的文件讀入緩衝區,達到必定大小時傳送給用戶,再繼續讀取,實現分片的效果。這樣瀏覽器就能夠持續地接受到數據,而沒必要等到全部文件讀取完畢,同時內存也不會佔用太大。
三、做爲靜態文件緩存:
將須要屢次反覆讀取,而且求改頻率很低的文件,第一次讀取時放入緩衝區,生成靜態文件,以後每次讀取能夠直接返回而不須要進過php的處理(讀取數據庫等)。
您可能感興趣的文章:
PHP緩衝區用法總結
PHP中對緩衝區的控制實現代碼
刷新PHP緩衝區爲你的站點加速
PHP5.0 TIDY_PARSE_FILE緩衝區溢出漏洞的解決方案
php中的buffer緩衝區用法分析
php flush類輸出緩衝剖析
php中ob(Output Buffer 輸出緩衝)函數使用方法
PHP 輸出緩衝控制(Output Control)詳解
php緩衝輸出實例分析
剖析 PHP 中的輸出緩衝
PHP輸出緩衝控制Output Control系列函數詳解
PHP嵌套輸出緩衝代碼實例
文章同步發佈: https://www.geek-share.com/de...