php ob系列函數中常用函數小結

WBOY
發布: 2016-07-30 13:31:47
原創
863 人瀏覽過

ob系列函數常用函數


ob_start();            //開啟一個輸出緩衝區,所有的輸出資訊不再直接傳送至瀏覽器,而是儲存於輸出緩衝區裡面。

ob_clean();            //移除內部緩衝區的內容,且未關閉緩衝區(未輸出)。
ob_end_clean();        //刪除內部緩衝區的內容,並關閉緩衝區(不輸出)。
ob_g​​et_clean();        //返回內部緩衝區的內容,並關閉緩衝區。相當於執行 ob_get_contents() and ob_end_clean()
ob_flush();            //傳送內部緩衝區的內容到瀏覽器,刪除緩衝區的內容,且不關閉緩衝區。
ob_end_flush();        //將內部緩衝區的內容傳送至瀏覽器,刪除緩衝區的內容,關閉緩衝區。
ob_g​​et_flush();        //返回內部緩衝區的內容,並關閉緩衝區,再釋放緩衝區的內容。相當於ob_end_flush()並傳回緩衝區內容。
flush();               //釋放ob_flush的內容,以及不在PHP緩衝區的內容,以全部輸出至瀏覽器;刷新內部緩衝區的內容,並輸出。

ob_g​​et_contents();     //返回緩衝區的內容,不輸出。
ob_g​​et_length();       //返回內部緩衝區的長度,如果緩衝區未被激活,則函數傳回FALSE。
ob_g​​et_level();        //Return the nesting level of the output buffering mechanism.
ob_g​​et_status();       //Get status of outoutput blicp.打開後ob_implicit_flush(true),所謂絕對刷新,即當有輸出語句(e.g: echo)被執行時,便把輸出直接送到瀏覽器,而不再需要呼叫flush()或等到腳本結束時才輸出。

ob_g​​zhandler               //ob_start回呼函數,並以gzip壓迫緩衝區的內容物。

ob_list_handlers           //List all output handlers in use

output_add_rewrite_var     //Add URL 對這些設定的影響:
output_buffering       //值為ON時,將在所有腳本中使用輸出控制;若該值為一個數字,則代表緩衝區的最大位元組限制,當快取內容達到該上限時將會自動向瀏覽器輸出目前的緩衝區裡的內容。
output_handler         //此選項可將腳本所有的輸出,並重新導向至一個函數。例如,將 output_handler 設為 mb_output_handler() 時,字元的編碼將被修改為指定的編碼。設定的任何處理函數,將自動的處理輸出緩衝。
implicit_flush         //作用與ob_implicit_flush,預設為Off。


用PHP的ob_start();
控制您的瀏覽器cache

Output Control 函數可以讓你自由控制腳本中資料的輸出。它非常有用,特別是對於:當你想在資料已經輸出後,再輸出檔案頭的情況。輸出控制函數不對使用 header() 或 setcookie(), 發送的檔案頭資訊產生影響,只對那些類似於 echo() 和 PHP 程式碼的資料區塊有作用。

我們先舉一個簡單的例子,讓大家對Output Control有一個大致的印象:
Example 1.

程式碼程式碼
ob_start(); //開啟緩衝區
echo "Hellon"; //輸出

header("location:index.php"); //把瀏覽器重定向到index.php

ob_end_flush();//輸出全部內容到瀏覽器
?>


所有對header()函數有了解的人都知道,這個函數會傳送一段檔案頭給瀏覽器,但是如果在使用這個函數之前已經有了任何輸出(包括空輸出,例如空格,回車和換行)就會提示出錯。如果我們去掉第一行的ob_start(),再執行此程序,我們會發現得到了一條錯誤提示:"Header had all ready send by"!但加上ob_start,就不會提示出錯,原因是當開啟了緩衝區,echo後面的字元不會輸出到瀏覽器,而是保留在伺服器,直到你使用flush或ob_end_flush才會輸出,所以並不會有任何文件頭輸出的錯誤!


一、 相關函數簡介:
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()


二、深入了解:

1. 關於Flush函數:
這個函數在PHP3就出現了,是一個效率很高的函數,他有一個非常有用的功能就是刷新browser的cache.我們舉一個運行效果非常明顯的例子來說明flush.
Example 2.

程式碼程式碼
for($i = 1; $i // 這句話非常關鍵,cache的結構使得它的內容只有達到一定的大小才能從瀏覽器輸出
// 換言之,如果cache的內容不達到一定的大小,它是不會在程式執行完畢前輸出的。經
// 過測試,我發現這個大小的底限是256個字元長。這表示cache以後接收的內容都會
// 源源不絕的被發送出去。
For($j = 1; $j echo $j."
";
flush(); //這一部會使cache新增的內容被擠出去,顯示到瀏覽器上
sleep(1); //讓程式"睡"一秒鐘,會讓你把效果看得更清楚
}
?>

註:如果在程式的首部加入ob_implicit_flush()開啟絕對刷新,就可以在程式中不再使用flush(),這樣做的好處是:提高效率!

2. 關於ob系列函數:
我想先引用我的好朋友y10k的一個例子:
Example 3.

比如你用得到伺服器和客戶端的設定信息,但是這個信息會因為客戶端的不同而不同,如果想要保存phpinfo()函數的輸出呢?在沒有緩衝區控制之前,可以說一點辦法也沒有,但是有了緩衝區的控制,我們可以輕鬆的解決:
程式碼程式碼
ob_start(); //開啟緩衝區
phpinfo( ); //使用phpinfo函數
$info=ob_get_contents(); //得到緩衝區的內容並且賦值給$info
$file=fopen('info.txt','w'); //開啟檔案info. txt
fwrite($file,$info); //寫入訊息到info.txt
fclose($file); //關閉檔案info.txt
?>

用以上的方法,就可以把不同使用者的phpinfo資訊保存下來,這在以前恐怕沒有辦法辦到!其實上面就是將一些"過程"轉換為"函數"的方法!
或許有人會問:"難道就這個樣子嗎?還有沒有其他用途?"當然有了,比如筆者論壇的PHP 語法加亮顯示就和這個有關(PHP預設的語法加亮顯示函數會直接輸出,不能儲存結果,如果在每次呼叫都顯示恐怕會很浪費CPU,筆者的論壇就把語法加亮函數顯示的結果用控制緩衝區的方法保留了),大家如果有興趣的話可以來看看

可能現在大家對ob_start()的功能有了一定的了解,上面的一個例子看似簡單,但實際上已經掌握了使用ob_start()的要點。
.使用ob_start開啟browser的cache,這樣可以確保cache的內容在你呼叫flush(),ob_end_flush()(或程式執行完畢)之前不會被輸出。
.現在的你應該知道你所擁有的優點:可以在任何輸出內容後面使用header,setcookie以及session,這是ob_start一個很大的特點;也可以使用ob_start的參數,在cache被寫入之後,然後自動執行指令,例如ob_start( "ob_gzhandler");而我們最常用的做法是用ob_get_contents()得到cache中的內容,然後再進行處理…
.當處理完畢後,我們可以使用各種方法輸出,flush(),ob_end_flush(),以及等到程式執行完畢後的自動輸出。當然,如果你用的是ob_get_contents(),那麼就要你自己控制輸出方式了。

來,讓我們看看能用ob系列函數做些什麼…

一、 靜態模版技術

簡介:所謂靜態模版技術就是透過某種方式,使得使用者在client端得到的是由PHP產生的html頁面。如果這個html頁面不會再更新,那麼當另外的使用者再次瀏覽此頁面時,程式將不會再呼叫PHP以及相關的資料庫,對於某些資訊量比較大的網站,例如sina,163,sohu。類似這種的技術帶來的好處是非常巨大的。

我所知道的實作靜態輸出的有兩種辦法:
.透過y10k修改的phplib的一個叫做template.inc.php類別實作。
.使用ob系列函數實作。
對於第一種方法,因為不是這篇文章所要研究的問題,所以不再贅述。
我們現在來看看第二種方法的具體實作:
Example 4.


程式碼程式碼
ob_start();//開啟緩衝區
?>
php頁面的全部輸出

$content = ob_get_contents();//取得php頁面輸出的全部內容
$fp = fopen("output00001.html", "w"); //建立一個文件,並且打開,準備寫入
fwrite ($fp, $content); //把php頁的內容全部寫入output00001.html,然後…
fclose($fp);
?>


這樣,所謂的靜態模版就很容易的被實現了……

二、 捕捉輸出

以上的Example 4.是一種最簡單的情況,你還可以在寫入前對$content進行操作……

你可以設法捕捉一些關鍵字,然後去對它進行再處理,例如Example 3.所述的PHP語法高亮顯示。個人認為,這個功能是此函數最大的精華所在,它可以解決各種各樣的問題,但需要你有足夠的想像力…

Example 5.

程式程式碼程式碼
Function run_code($code) {
    If($code) {
        ob_start();
        eval($code);
         ob_end_clean();
    }else {
       echo "且錯誤!沒有產出" ;
       exit();
}
return $contents;
?>
}

以上這個例子的用途不是很大,不過很典型把$code的本身就是一個含有變數的輸出頁面,而這個例子用以上這個例子的用途不是很大,不過很典型把$code的本身就是一個含有變數的輸出頁面,而這個例子用上eval $code中的變數替換,然後對輸出結果再進行輸出捕捉,再一次的進行處理……

二、 輸出緩存句柄ob_gzhandler

PHP4.0.4有一個新的輸出緩存句柄ob_gzhandler,它與前面的類別相似,但用法不同。使用ob_gzhandler時要在php.ini加入的內容如下:  


output_handler = ob_gzhandler;

這行程式碼使得PHP激活輸出緩存,並壓縮它發送出去的所有內容。
如果因為某些原因你不想在php.ini加上這行程式碼,你也可以透過PHP原始檔所在目錄的.htaccess檔改變預設的伺服器行為(不壓縮),文法如下:   



php_value output_handler ob_gzhandler

或從PHP程式碼調用,如下所示:


ob_start("ob_gzhandler");


採用輸出快取句柄的方法確實非常有效,而且不會為伺服器帶來什麼特殊的負載。但必須注意的是,Netscape Communicator對壓縮圖形的支援不佳,因此除非你能夠保證所有使用者都使用IE瀏覽器,否則你應該禁止壓縮JPEG和GIF圖形。一般地,對於所有其他文件,這種壓縮都有效,但建議你針對各種瀏覽器都分別進行測試,特別是當你使用了特殊的插件或資料檢視器時這一點尤其重要。
注意事項:
1、某些Web伺服器的output_buffering預設為4069字元或更大,即輸出內容必須達到4069字元伺服器才會flush刷新輸出緩衝,為了確保flush有效,最好在ob_flush()函數前有以下語句:

程式碼如下:

print str_repeat("", 4096);  //確保到達output_buffering值


2、ob_* 系列函數是操作PHP本身的輸出緩衝區,所以ob_proush
2、ob_* 系列函式是操作PHP本身的輸出緩衝區,所以ob_push區,而flush是刷新apache的緩衝區。所以,正確使用倆者的順序是:先ob_flush,然後flush。 ob_flush是把資料從PHP的緩衝中釋放出來,flush是把緩衝內/外的資料全部傳送到瀏覽器。
3、不要誤認為用了ob_start()後,腳本的echo/print等輸出就永遠不會顯示在瀏覽器上了。因為PHP腳本運行結束後,會自動刷新緩衝區並輸出內容。

以上就介紹了php ob系列函數中常用函數小結,包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。

🎜
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!