欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

控制PHP的輸出:緩存并壓縮動(dòng)態(tài)頁(yè)面

 更新時(shí)間:2013年06月11日 23:41:32   作者:  
PHP4中最令人滿(mǎn)意的事是——你可以讓PHP緩存所有由腳本生成的輸出,在你決定把它們送出之前,瀏覽器方是不會(huì)收到任何內(nèi)容的

mod_gzip是一個(gè)Apache模塊,其功能是使用Gzip壓縮靜態(tài)的html頁(yè)面,遵循IETF標(biāo)準(zhǔn)的瀏覽器可以接受gzip編碼(IE, Netscape等)。mod_gzip可以將頁(yè)面的下載時(shí)間提高4-5倍。我強(qiáng)烈建議你在你的web服務(wù)器上使用mod_gzip。然而,我們還必須用PHP建立我們自己的壓縮引擎。在這篇文章里,我將要介紹如何使用PHP的輸出控制函數(shù)來(lái)大幅加速頁(yè)面載入速度。

介紹PHP的輸出控制函數(shù)

PHP4中最令人滿(mǎn)意的事是——你可以讓PHP緩存所有由腳本生成的輸出,在你決定把它們送出之前,瀏覽器方是不會(huì)收到任何內(nèi)容的。在腳本程序中你能用這些函數(shù)來(lái)設(shè)置header、cookies,然而這只是強(qiáng)大的輸出函數(shù)的一小部分功能。

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

<?php
void ob_start(void);
?>

告訴PHP處理器把所有的輸出重定向到一個(gè)內(nèi)部的緩存(buffer)中。在調(diào)用ob_start之前,沒(méi)有輸出會(huì)被送到瀏覽器去。

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

<?php
string ob_get_contents(void);
?>

該函數(shù)將“輸出緩存”(output buffer)以字符串的形式返回。你可以調(diào)用該函數(shù)把積累下來(lái)的輸出送到瀏覽器中。(僅在把buffering功能關(guān)閉之后!?。?

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

<?php
int ob_get_length(void);
?>

返回緩存中的字符串的長(zhǎng)度。

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

<?php
void ob_end_clean(void);
?>

清空輸出緩存,并將輸出緩存關(guān)閉。在緩存中的內(nèi)容輸出到瀏覽器之前,必須使用這個(gè)函數(shù)。
void 501([int flag])
用來(lái)打開(kāi)/關(guān)閉隱含的flush動(dòng)作開(kāi)關(guān)(默認(rèn)是關(guān))。如果flush是開(kāi)的,每次調(diào)用print/echo或是其它輸出命令的時(shí)候,輸出的內(nèi)容會(huì)被立即送到瀏覽器端。

使用輸出控制來(lái)壓縮PHP輸出
你必須使用PHP4里編譯的Zlib擴(kuò)展包來(lái)壓縮輸出。如果需要的話(huà),可以查看PHP文檔中有關(guān)Zlib包的安裝指導(dǎo)。
首先,初始化輸出緩存:

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

<?php
ob_start();
ob_implicit_flush(0);
?>

之后,用print, echo, 或其他你喜歡的方法生成所有輸出內(nèi)容,例如:

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

<?php
print("Hey this is a compressed output!");
?>

頁(yè)面生成后,我們?nèi)』剌敵鰞?nèi)容:

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

<?php
$contents = ob_get_contents();
ob_end_clean();
?>

之后,必須檢測(cè)瀏覽器是否支持壓縮數(shù)據(jù)。如果支持,瀏覽器會(huì)發(fā)給服務(wù)器端一個(gè)ACCEPT-ENCODEING HTTP頭。我們只需檢查$HTTP_ACCEPT_ENCODING變量中是否有“gzip,deflate”字串。

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

<?php
if(ereg('gzip, deflate',$HTTP_ACCEPT_ENCODING)) {
// 在這里生成 Gzip 壓縮的內(nèi)容
} else {
echo $contents;
}
?>

這種方法使用起來(lái)既簡(jiǎn)單又結(jié)構(gòu)清晰。下面讓我們看看如何生成壓縮的輸出:

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

<?php
//告訴瀏覽器將要收到的是gzip數(shù)據(jù)
//當(dāng)然在此之前,你已經(jīng)檢查了它們是否支持gzip,x-gzip數(shù)據(jù)格式
//如果支持的是x-gzip,那么下面的頭就要用z-gzip來(lái)代替
header("Content-Encoding: gzip");

//顯示gzip文件的頭
//只需顯示一次
echo "x1fx8bx08x00x00x00x00x00";

//計(jì)算出文件的大小和CRC碼
$Size = strlen($contents);
$Crc = crc32($contents);

//壓縮數(shù)據(jù)
$contents = gzcompress($contents, 9);

//我們不能就這樣輸出,因?yàn)镃RC碼是混亂的。
//如果我在這里使用“echo $contents”,壓縮的數(shù)據(jù)會(huì)被送出,
//但是卻不完整。文件最后的四個(gè)字節(jié)是CRC校驗(yàn)碼,可是只發(fā)出去了三個(gè)字節(jié)。
//最后一個(gè)字節(jié)被丟掉了。我不知道這個(gè)bug在4.0.2版中解決了沒(méi)有,
//不過(guò)最好避免錯(cuò)誤的方法是把正確的CRC校驗(yàn)碼加到壓縮的數(shù)據(jù)的末尾。
//
//把舊的CRC校驗(yàn)碼剝離
$contents = substr($contents, 0, strlen($contents) - 4);

//僅顯示壓縮的數(shù)據(jù)
echo $contents;

//輸出CRC,和原來(lái)數(shù)據(jù)的大?。ㄗ止?jié))
gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);

function gzip_PrintFourChars($Val) {
for ($i = 0; $i <4; $i ++) {
echo chr($Val % 256);
$Val = floor($Val / 256);
}
}

?>
//好了,你還可以按此方式附加上更多的壓縮數(shù)據(jù)。

要想進(jìn)行實(shí)際的測(cè)試,所有的腳本代碼如下:

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

<?php
ob_start();
ob_implicit_flush(0);

print("I'm compressed!n");

$contents = ob_get_contents();
ob_end_clean();

header("Content-Encoding: gzip");

echo "x1fx8bx08x00x00x00x00x00";

$Size = strlen($contents);
$Crc = crc32($contents);

$contents = gzcompress($contents, 9);

$contents = substr($contents, 0, strlen($contents) - 4);

echo $contents;

gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);

function gzip_PrintFourChars($Val) {
for ($i = 0; $i <4; $i ++) {
echo chr($Val % 256);
$Val = floor($Val / 256);
}
}
?>

緩存PHP輸出

當(dāng)PHP4還沒(méi)問(wèn)世,我不得不使用PHP3的時(shí)候,我對(duì)開(kāi)發(fā)一些緩存機(jī)制來(lái)減少數(shù)據(jù)庫(kù)的載入、對(duì)文件系統(tǒng)的存取十分感興趣。在PHP3中沒(méi)有什么特別好的方法,但是有了輸出緩存之后,在PHP4中一切變得容易多了。
這有一個(gè)簡(jiǎn)單的例子:

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

<?php
//為請(qǐng)求的URI構(gòu)造一個(gè)文件名
$cached_file=md5($REQUEST_URI);

if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file"))) {
//is_valid函數(shù)驗(yàn)證緩存,你可以用這個(gè)函數(shù)檢查Cache是否過(guò)期或其他特定的條件。
//如果文件不在Cache中或者不可用則生成輸出
ob_start();
ob_implicit_flush(0);
//在此輸出……

$contents = ob_get_contents();
ob_end_clean();
$fil=fopen($cached_file,"w+");
fwrite($fil,$contents,$strlen($contents));
fclose($fil);
}

/如果請(qǐng)求的文件在緩存中且可用,則:
readfile($cached_file);

?>

這是一個(gè)簡(jiǎn)單的例子,使用輸出緩存,你可以建立一個(gè)復(fù)雜的內(nèi)容生成系統(tǒng),對(duì)不同的塊或程序使用不同的緩存機(jī)制,等等……

結(jié)論

PHP輸出控制函數(shù)對(duì)把腳本生成的輸出重定向到緩存中十分有用。為支持gzip的瀏覽器輸出壓過(guò)的緩存數(shù)據(jù)可以減少載入時(shí)間。也可作為緩存機(jī)制來(lái)減少對(duì)數(shù)據(jù)源的存?。〝?shù)據(jù)庫(kù)或文件),這對(duì)使用XML意義重大。
如果我們用PHP建立一個(gè)引擎,緩存從數(shù)據(jù)源得到的數(shù)據(jù)(xml文檔和數(shù)據(jù)庫(kù)),并且動(dòng)態(tài)的生成XML格式的內(nèi)容(沒(méi)有外觀(guān)-presentation)我們可以得到這些XML的輸出,并使用XSLT轉(zhuǎn)換成任意一種我們想要的外觀(guān)格式(html, wap, palm, pdf等)。使用PHP4的輸出緩存和Sablotron XSLT擴(kuò)展可以很好地完成這個(gè)任務(wù)。

相關(guān)文章

  • 設(shè)定php簡(jiǎn)寫(xiě)功能的方法

    設(shè)定php簡(jiǎn)寫(xiě)功能的方法

    在本篇文章里小編給大家整理的是關(guān)于如何設(shè)定php簡(jiǎn)寫(xiě)功能的相關(guān)文章以及知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。
    2019-11-11
  • php接口報(bào)錯(cuò)解決分析記錄

    php接口報(bào)錯(cuò)解決分析記錄

    記一次解決php接口報(bào)錯(cuò) The GET method is not supported for this route. Supported methods: POST.的bug,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • PHP判斷文章里是否有圖片的簡(jiǎn)單方法

    PHP判斷文章里是否有圖片的簡(jiǎn)單方法

    這篇文章主要介紹了PHP判斷文章里是否有圖片的方法,很實(shí)用的功能,需要的朋友可以參考下
    2014-07-07
  • 詳解PHP intval()函數(shù)的實(shí)例用法

    詳解PHP intval()函數(shù)的實(shí)例用法

    本篇文章主要給大家介紹php intval函數(shù)怎么用,那么intval()函數(shù)是PHP中的內(nèi)置函數(shù),它返回變量的整數(shù)值,文中通過(guò)代碼詳細(xì)介紹了PHP intval()函數(shù)的用法,需要的朋友可以參考下
    2023-07-07
  • PHP錯(cuò)誤Warning:mysql_query()解決方法

    PHP錯(cuò)誤Warning:mysql_query()解決方法

    這篇文章主要介紹了PHP錯(cuò)誤Warning:mysql_query()的解決方法,希望可以真正解決大家的問(wèn)題,需要的朋友可以參考下
    2015-10-10
  • php+mysqli批量查詢(xún)多張表數(shù)據(jù)的方法

    php+mysqli批量查詢(xún)多張表數(shù)據(jù)的方法

    這篇文章主要介紹了php+mysqli批量查詢(xún)多張表數(shù)據(jù)的方法,涉及multi_query、store_result及more_results等函數(shù)的使用技巧,需要的朋友可以參考下
    2015-01-01
  • PHP中對(duì)用戶(hù)身份認(rèn)證實(shí)現(xiàn)兩種方法

    PHP中對(duì)用戶(hù)身份認(rèn)證實(shí)現(xiàn)兩種方法

    用戶(hù)在設(shè)計(jì)和維護(hù)站點(diǎn)的時(shí)候,經(jīng)常需要限制對(duì)某些重要文件或信息的訪(fǎng)問(wèn)。通常,我們可以采用內(nèi)置于WEB服務(wù)器的基于HTTP協(xié)議的用戶(hù)身份驗(yàn)證機(jī)制。
    2011-06-06
  • php單例模式實(shí)現(xiàn)方法分析

    php單例模式實(shí)現(xiàn)方法分析

    這篇文章主要介紹了php單例模式,實(shí)例分析了單例模式的原理與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • PHP+jquery+ajax實(shí)現(xiàn)即時(shí)聊天功能實(shí)例

    PHP+jquery+ajax實(shí)現(xiàn)即時(shí)聊天功能實(shí)例

    這篇文章主要介紹了PHP+jquery+ajax實(shí)現(xiàn)即時(shí)聊天功能的方法,實(shí)例分析了php聊天功能的信息無(wú)刷新提交方法,以及信息發(fā)送處理等功能,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • php實(shí)現(xiàn)html標(biāo)簽閉合檢測(cè)與修復(fù)方法

    php實(shí)現(xiàn)html標(biāo)簽閉合檢測(cè)與修復(fù)方法

    這篇文章主要介紹了php實(shí)現(xiàn)html標(biāo)簽閉合檢測(cè)與修復(fù)方法,可實(shí)現(xiàn)針對(duì)html標(biāo)簽中結(jié)束標(biāo)簽的檢測(cè)與補(bǔ)全功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-07-07

最新評(píng)論