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的基本作用。
對於剛才說的第三點中的GZIP壓縮,可能是很多人想用,卻沒有真真用上的,其實稍稍修改下我朋友的代碼,就可以實現頁面的gzip壓縮。
ob_start(ob_gzhandler); 內容
沒錯,加一個ob_gzhandler這個回調函數就可以了,不過這麼做有些小問題,一是需要zlib支持,二是沒有判斷浏覽器是否支持gzip(現在好像都支持,iphone浏覽器好像都支持了)。
以前的做法是判斷一下浏覽器是否支持gzip,然後用第三方的gzip函數來壓縮ob_get_contents() 的內容,最後echo。