溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP輸出緩存ob系列函數(shù)有哪些

發(fā)布時(shí)間:2021-10-08 11:53:26 來源:億速云 閱讀:146 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“PHP輸出緩存ob系列函數(shù)有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“PHP輸出緩存ob系列函數(shù)有哪些”吧!

ob的基本原則:如果ob緩存打開,則echo的數(shù)據(jù)首先放在ob緩存。如果是header信息,直接放在程序緩存。當(dāng)頁面執(zhí)行到最后,會(huì)把ob緩存的數(shù)據(jù)放到程序緩存,然后依次返回給瀏覽器。
下面我說說ob的基本作用:
  1)防止在瀏覽器有輸出之后再使用setcookie()、header()或session_start()等發(fā)送頭文件的函數(shù)造成的錯(cuò)誤。其實(shí)這樣的用法少用為好,養(yǎng)成良好的代碼習(xí)慣。
  2)捕捉對(duì)一些不可獲取的函數(shù)的輸出,比如phpinfo()會(huì)輸出一大堆的HTML,但是我們無法用一個(gè)變量例如$info=phpinfo();來捕捉,這時(shí)候ob就管用了。
  3)對(duì)輸出的內(nèi)容進(jìn)行處理,例如進(jìn)行g(shù)zip壓縮,例如進(jìn)行簡(jiǎn)繁轉(zhuǎn)換,例如進(jìn)行一些字符串替換。
  4)生成靜態(tài)文件,其實(shí)就是捕捉整頁的輸出,然后存成文件。經(jīng)常在生成HTML,或者整頁緩存中使用。

對(duì)于剛才說的第三點(diǎn)中的GZIP壓縮,可能是很多人想用,卻沒有真用上的,其實(shí)稍稍修改下代碼,就可以實(shí)現(xiàn)頁面的gzip壓縮。

復(fù)制代碼 代碼如下:

ob_start(ob_gzhandler);
要緩存的內(nèi)容


沒錯(cuò),加一個(gè)ob_gzhandler這個(gè)回調(diào)函數(shù)就可以了,不過這么做有些小問題,一是需要zlib支持,二是沒有判斷瀏覽器是否支持gzip(現(xiàn)在好像都支持,iphone瀏覽器好像都支持了)。
以前的做法是判斷一下瀏覽器是否支持gzip,然后用第三方的gzip函數(shù)來壓縮ob_get_contents() 的內(nèi)容,最后echo。

一、ob系列函數(shù)中常用函數(shù)集錦

復(fù)制代碼 代碼如下:


ob_start();            //打開一個(gè)輸出緩沖區(qū),所有的輸出信息不再直接發(fā)送到瀏覽器,而是保存在輸出緩沖區(qū)里面。

ob_clean();            //刪除內(nèi)部緩沖區(qū)的內(nèi)容,不關(guān)閉緩沖區(qū)(不輸出)。
ob_end_clean();        //刪除內(nèi)部緩沖區(qū)的內(nèi)容,關(guān)閉緩沖區(qū)(不輸出)。
ob_get_clean();        //返回內(nèi)部緩沖區(qū)的內(nèi)容,關(guān)閉緩沖區(qū)。相當(dāng)于執(zhí)行 ob_get_contents() and ob_end_clean()
ob_flush();            //發(fā)送內(nèi)部緩沖區(qū)的內(nèi)容到瀏覽器,刪除緩沖區(qū)的內(nèi)容,不關(guān)閉緩沖區(qū)。
ob_end_flush();        //發(fā)送內(nèi)部緩沖區(qū)的內(nèi)容到瀏覽器,刪除緩沖區(qū)的內(nèi)容,關(guān)閉緩沖區(qū)。
ob_get_flush();        //返回內(nèi)部緩沖區(qū)的內(nèi)容,并關(guān)閉緩沖區(qū),再釋放緩沖區(qū)的內(nèi)容。相當(dāng)于ob_end_flush()并返回緩沖區(qū)內(nèi)容。
flush();               //將ob_flush釋放出來的內(nèi)容,以及不在PHP緩沖區(qū)中的內(nèi)容,全部輸出至瀏覽器;刷新內(nèi)部緩沖區(qū)的內(nèi)容,并輸出。

ob_get_contents();     //返回緩沖區(qū)的內(nèi)容,不輸出。
ob_get_length();       //返回內(nèi)部緩沖區(qū)的長(zhǎng)度,如果緩沖區(qū)未被激活,該函數(shù)返回FALSE。
ob_get_level();        //Return the nesting level of the output buffering mechanism.
ob_get_status();       //Get status of output buffers.

ob_implicit_flush();   //打開或關(guān)閉絕對(duì)刷新,默認(rèn)為關(guān)閉,打開后ob_implicit_flush(true),所謂絕對(duì)刷新,即當(dāng)有輸出語句(e.g: echo)被執(zhí)行時(shí),便把輸出直接發(fā)送到瀏覽器,而不再需要調(diào)用flush()或等到腳本結(jié)束時(shí)才輸出。

ob_gzhandler               //ob_start回調(diào)函數(shù),用gzip壓縮緩沖區(qū)的內(nèi)容。
ob_list_handlers           //List all output handlers in use
output_add_rewrite_var     //Add URL rewriter values
output_reset_rewrite_vars  //Reset URL rewriter values

這些函數(shù)的行為受php_ini設(shè)置的影響:
output_buffering       //該值為ON時(shí),將在所有腳本中使用輸出控制;若該值為一個(gè)數(shù)字,則代表緩沖區(qū)的最大字節(jié)限制,當(dāng)緩存內(nèi)容達(dá)到該上限時(shí)將會(huì)自動(dòng)向?yàn)g覽器輸出當(dāng)前的緩沖區(qū)里的內(nèi)容。
output_handler         //該選項(xiàng)可將腳本所有的輸出,重定向到一個(gè)函數(shù)。例如,將 output_handler 設(shè)置為 mb_output_handler() 時(shí),字符的編碼將被修改為指定的編碼。設(shè)置的任何處理函數(shù),將自動(dòng)的處理輸出緩沖。
implicit_flush         //作用同ob_implicit_flush,默認(rèn)為Off。

二、實(shí)例講解

1、使 header() 函數(shù)前可以有echo代碼
Output Control 函數(shù)可以讓你自由控制腳本中數(shù)據(jù)的輸出。它非常地有用,特別是對(duì)于:當(dāng)你想在數(shù)據(jù)已經(jīng)輸出后,再輸出文件頭的情況。
輸出控制函數(shù)不對(duì)使用 header() 或 setcookie(),發(fā)送的文件頭信息產(chǎn)生影響,只對(duì)那些類似于 echo() 和 PHP 代碼的數(shù)據(jù)塊有作用。 

復(fù)制代碼 代碼如下:

ob_start();                   //打開緩沖區(qū) 
echo "Hello\n";               //輸出 
header(“l(fā)ocation:index.php”); //把瀏覽器重定向到index.php  
ob_end_flush();               //輸出全部?jī)?nèi)容到瀏覽器


所有對(duì)header()函數(shù)有了解的人都知道,這個(gè)函數(shù)會(huì)發(fā)送一段文件頭給瀏覽器,但是如果在使用這個(gè)函數(shù)之前已經(jīng)有了任何輸出(包括空輸出,比如空格,回車和換行)就會(huì)提示出錯(cuò)。如果我們?nèi)サ舻谝恍械膐b_start(),再執(zhí)行此程序,我們會(huì)發(fā)現(xiàn)得到了一條錯(cuò)誤提示:"Header had all ready send by"!但是加上ob_start,就不會(huì)提示出錯(cuò),原因是當(dāng)打開了緩沖區(qū),echo后面的字符不會(huì)輸出到瀏覽器,而是保留在服務(wù)器,直到你使用flush或者ob_end_flush才會(huì)輸出,所以并不會(huì)有任何文件頭輸出的錯(cuò)誤!
2、保存 phpinfo() 函數(shù)的輸出

復(fù)制代碼 代碼如下:

ob_start();                      //打開緩沖區(qū)  
phpinfo();                       //使用phpinfo函數(shù)  
$info = ob_get_contents();       //得到緩沖區(qū)的內(nèi)容并且賦值給$info  
$file = fopen('info.txt', 'w');  //打開文件info.txt  
fwrite($file, $info);            //寫入信息到info.txt  
fclose($file);                   //關(guān)閉文件info.txt


3、靜態(tài)模版技術(shù)
所謂靜態(tài)模版技術(shù)就是通過某種方式,使得用戶在client端得到的是由PHP產(chǎn)生的html頁面。如果這個(gè)html頁面不會(huì)再被更新,那么當(dāng)另外的用戶再次瀏覽此頁面時(shí),程序?qū)⒉粫?huì)再調(diào)用PHP以及相關(guān)的數(shù)據(jù)庫,對(duì)于某些信息量比較大的網(wǎng)站,例如sina、163、sohu。類似這種的技術(shù)帶來的好處是非常巨大的。

復(fù)制代碼 代碼如下:

ob_start();                            //打開緩沖區(qū)
php頁面的全部輸出  
$content = ob_get_contents();          //取得php頁面輸出的全部?jī)?nèi)容  
$fp = fopen("output00001.html", "w");  //創(chuàng)建一個(gè)文件,并打開,準(zhǔn)備寫入  
fwrite($fp, $content);                 //把php頁面的內(nèi)容全部寫入output00001.html,然后……  
fclose($fp);


三、輸出緩存句柄ob_gzhandler
PHP4.0.4有一個(gè)新的輸出緩存句柄ob_gzhandler,它與前面的類相似,但用法不同。使用ob_gzhandler時(shí)要在php.ini中加入的內(nèi)容如下:  

復(fù)制代碼 代碼如下:

output_handler = ob_gzhandler;


這行代碼使得PHP激活輸出緩存,并壓縮它發(fā)送出去的所有內(nèi)容。

如果由于某種原因你不想在php.ini中加上這行代碼,你還可以通過PHP源文件所在目錄的.htaccess文件改變默認(rèn)的服務(wù)器行為(不壓縮),語法如下:   

復(fù)制代碼 代碼如下:

php_value output_handler ob_gzhandler


或者是從PHP代碼調(diào)用,如下所示:

復(fù)制代碼 代碼如下:

ob_start("ob_gzhandler");


采用輸出緩存句柄的方法確實(shí)非常有效,而且不會(huì)給服務(wù)器帶來什么特殊的負(fù)荷。但必須注意的是,Netscape Communicator對(duì)壓縮圖形的支持不佳,因此除非你能夠保證所有用戶都使用IE瀏覽器,否則你應(yīng)該禁止壓縮JPEG和GIF圖形。一般地,對(duì)于所有其他文件,這種壓縮都有效,但建議你針對(duì)各種瀏覽器都分別進(jìn)行測(cè)試,特別是當(dāng)你使用了特殊的插件或者數(shù)據(jù)查看器時(shí)這一點(diǎn)尤其重要。
注意事項(xiàng):
1、一些Web服務(wù)器的output_buffering默認(rèn)是4069字符或者更大,即輸出內(nèi)容必須達(dá)到4069字符服務(wù)器才會(huì)flush刷新輸出緩沖,為了確保flush有效,最好在ob_flush()函數(shù)前有以下語句:

復(fù)制代碼 代碼如下:

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


2、ob_* 系列函數(shù)是操作PHP本身的輸出緩沖區(qū),所以ob_flush只刷新PHP自身的緩沖區(qū),而flush是刷新apache的緩沖區(qū)。所以,正確使用倆者的順序是:先ob_flush,然后flush。ob_flush是把數(shù)據(jù)從PHP的緩沖中釋放出來,flush是把緩沖內(nèi)/外的數(shù)據(jù)全部發(fā)送到瀏覽器。
3、不要誤認(rèn)為用了ob_start()后,腳本的echo/print等輸出就永遠(yuǎn)不會(huì)顯示在瀏覽器上了。因?yàn)镻HP腳本運(yùn)行結(jié)束后,會(huì)自動(dòng)刷新緩沖區(qū)并輸出內(nèi)容。

到此,相信大家對(duì)“PHP輸出緩存ob系列函數(shù)有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI