程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 釋疑PHP的ob_start()函數

釋疑PHP的ob_start()函數

編輯:關於PHP編程

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 文件的內容作為輸出了。

ob_start();
內容
echo ob_get_contents() ;

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

我仔細想過之後,然後上網搜索了一下,發現相當多的初學者(技術上的初學者,不一定是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_gzhandler);
內容

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved