天天看點

PHP ob_start() 函數介紹

php ob_start 與 ob_end_flush() 是 php 的緩沖輸出函數。

ob_start([string output_callback])- 打開輸出緩沖區,所有的輸出資訊不在直接發送到浏覽器,而是儲存在輸出緩沖區裡面,可選得回調函數用于處理輸出結果資訊。 

ob_end_flush - 結束(發送)輸出緩沖區的内容,關閉輸出緩沖區。

php 輸出東西,會儲存在一個 php 維護的記憶體裡,稱為 buffer 也行,緩存也行,都是一個意思。然後當這個 buffer 滿了,php 會自動往 web server 發送這些資料。

也就是說每次 echo,并不一定會輸出東西,而是儲存在 buffer 裡。

ob_start() 的意思,可以了解為(但是實際上和我下面的說法有差別),這個 buffer 由

ob_ 系列函數來來控制,也就是,PHP 不會維護自己的 buffer,不會自動把buffer 的内容自動發送到 web server,直到你

ob_end() 或者類似的 ob 操作。

ob_函數一般用來捕獲目前的輸出,跟效率是沒什麼關系的。至于為什麼捕獲輸出,原因很多,例如我捕捉輸出,緩存到一個檔案裡,下次請求就可以直接讀這個  cache 檔案的内容作為輸出了。

1ob_start();

2内容

3echoob_get_contents() ;

就是類似上面這樣的代碼了,說白了沒有任何意義的代碼。

我仔細想過之後,然後上網搜尋了一下,發現相當多的初學者(技術上的初學者,不一定是PHP第一年生,有的人一輩子是初學者),并不了解ob的作用,隻是網上經常把ob叫做輸出緩沖,輸出緩存,是以相當多的人就把ob系列函數當作是加快PHP頁面顯示的工具。

其實ob是output buffering的簡稱,而不是output cache,ob用對了是能對速度有一定的幫助,但是盲目的加上ob函數,隻會增加CPU額外的負擔。下面我說說ob的基本作用。

防止在浏覽器有輸出之後再使用setcookie,或者header,session_start函數造成的錯誤。(我本以為最開始說的代碼是這樣的作用,但後來朋友說不是的),其實這樣的用法少用為好,養成良好的代碼習慣。

捕捉對一些不可擷取的函數的輸出,比如phpinfo會輸出一大堆的HTML,但是我們無法用一個變量例如$info=phpinfo();來捕捉,這時候ob就管用了。

對輸出的内容進行處理,例如進行gzip壓縮,例如進行簡繁轉換,例如進行一些字元串替換。

生成靜态檔案,其實就是捕捉整頁的輸出,然後存成檔案,經常在生成HTML,或者整頁緩存中使用。

對于剛才說的第三點中的GZIP壓縮,可能是很多人想用,卻沒有真真用上的,其實稍稍修改下我朋友的代碼,就可以實作頁面的gzip壓縮。

1ob_start(ob_gzhandler);

沒錯,加一個ob_gzhandler這個回調函數就可以了,不過這麼做有些小問題,一是需要zlib支援,二是沒有判斷浏覽器是否支援gzip(現在好像都支援,iphone浏覽器好像都支援了)。

以前的做法是判斷一下浏覽器是否支援gzip,然後用第三方的gzip函數來壓縮ob_get_contents() 的内容,最後echo。