一、 相關函數簡介:
1、Flush:刷新緩衝區的內容,輸出。
函數格式:flush()
說明:這個函數經常使用,效率很高。
2、ob_start :打開輸出緩衝區
函數格式:void ob_start(void)
說明:當緩衝區激活時,所有來自PHP程序的非文件頭信息均不會發送,而是保存在內部緩衝區。爲了輸出緩衝區的內容,可以使用ob_end_flush()或flush()輸出緩衝區的內容。
3 、ob_get_contents :返回內部緩衝區的內容。
使用方法:string ob_get_contents(void)
說明:這個函數會返回當前緩衝區中的內容,如果輸出緩衝區沒有激活,則返回 FALSE 。
4、ob_get_length:返回內部緩衝區的長度。
使用方法:int ob_get_length(void)
說明:這個函數會返回當前緩衝區中的長度;和ob_get_contents一樣,如果輸出緩衝區沒有激活。則返回 FALSE。
5、ob_end_flush :發送內部緩衝區的內容到瀏覽器,並且關閉輸出緩衝區。
使用方法:void ob_end_flush(void)
說明:這個函數發送輸出緩衝區的內容(如果有的話)。
6、ob_end_clean:刪除內部緩衝區的內容,並且關閉內部緩衝區
使用方法:void ob_end_clean(void)
說明:這個函數不會輸出內部緩衝區的內容而是把它刪除!
7、ob_implicit_flush:打開或關閉絕對刷新
使用方法:void ob_implicit_flush ([int flag])
說明:使用過Perl的人都知道$|=x的意義,這個字符串可以打開/關閉緩衝區,而ob_implicit_flush函數也和那個一樣,默認爲關閉緩衝區,打開絕對輸出後,每個腳本輸出都直接發送到瀏覽器,不再需要調用 flush()
ob_start() 開始輸出緩衝, 這時PHP停止輸出, 在這以後的輸出都被轉到一個內部的緩衝裏.
ob_get_contents() 這個函數返回內部緩衝的內容. 這就等於把這些輸出都變成了字符串.
ob_get_ length() 返回內部緩衝的長度.
ob_end_flush() 結束輸出緩衝, 並輸出緩衝裏的內容. 在這以後的輸出都是正常輸出.
ob_end_clean() 結束輸出緩衝, 並扔掉緩衝裏的內容.
舉個例子, var_dump()函數輸出一個變量的結構和內容, 這在調試的時候很有用.
但如果變量的內容裏有 < , > 等HTML的特殊字符, 輸出到網頁裏就看不見了. 怎麼辦呢?
用輸出緩衝函數能很容易的解決這個問題.
ob_start();
var_dump($var);
$out = ob_get_contents();
ob_end_clean();
這時var_dump()的輸出已經存在 $out 裏了. 你可以現在就輸出:
echo '<pre>' . htmlspecialchars($out) . '</pre>' ;
或者等到將來, 再或者把這個字符串送到模板(Template)裏再輸出
ob_start()
僅僅說作用,不說怎麼用,怎麼用自己找,網上都有,今天只是幫有點模模糊糊的人清楚起來。
昨天看到朋友公司的代碼就是類似上面這樣的代碼了,說白了沒有任何意義的代碼(我問了 不是爲了setcookie header這類)。
我仔細想過之後,然後上網搜索了一下,發現相當多的初學者(技術上的初學者,不一定是PHP第一年生,有的人一輩子是初學者),並不理解ob的作用,只是網上經常把ob叫做輸出緩衝,輸出緩存,所以相當多的人就把ob系列函數當作是加快PHP頁面顯示的工具。
其實ob是output buffering的簡稱,而不是output cache,ob用對了,是能對速度有一定的幫助,但是盲目的加上ob函數,只會增加CPU額外的負擔。下面我說說ob的基本作用。
1.防止在瀏覽器有輸出之後再使用setcookie,或者header,session_start函數造成的錯誤。(我本以爲最開始說的代碼是這樣的作用,但後來朋友說不是的),其實這樣的用法少用爲好,養成良好的代碼習慣。
2.捕捉對一些不可獲取的函數的輸出,比如phpinfo會輸出一大堆的HTML,但是我們無法用一個變量例如$info=phpinfo();來捕捉,這時候ob就管用了
3.對輸出的內容進行處理,例如進行gzip壓縮,例如進行簡繁轉換,例如進行一些字符串替換。
4.生成靜態文件,其實就是捕捉整頁的輸出,然後存成文件,經常在生成HTML,或者整頁緩存中使用。
對於剛纔說的第三點中的GZIP壓縮,可能是很多人想用,卻沒有真真用上的,其實稍稍修改下我朋友的代碼,就可以實現頁面的gzip壓縮。
ob_start();
....
ob_clean();
這兩句中間的任意輸出,都可以用ob_get_contents();來獲取而不輸出到瀏覽器.
經典應用:將phpinfo()的信息寫到文件裏.
ob_start();
phpinfo();
$phpinfo = ob_get_contents();
//文件讀寫操作
ob_clean();