關於ob_start()

ob_startOutput Control 函數可以讓你自由控制腳本中數據的輸出。它非常地有用,特別是對於:當你想在數據已經輸出後,再輸出文件頭的情況。輸出控制函數不對使用 header() 或 setcookie(), 發送的文件頭信息產生影響,只對那些類似於 echo() 和 PHP 代碼的數據塊有作用。
一、 相關函數簡介: 
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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章