成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何控制PHP輸出緩存并壓縮動態(tài)頁面-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)如何控制PHP輸出緩存并壓縮動態(tài)頁面的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),奇臺企業(yè)網(wǎng)站建設(shè),奇臺品牌網(wǎng)站建設(shè),網(wǎng)站定制,奇臺網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,奇臺網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

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

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

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

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


<?php
void ob_start(void);
?>


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

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


<?php
string ob_get_contents(void);
?>


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

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


<?php
int ob_get_length(void);
?>


返回緩存中的字符串的長度。

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


<?php
void ob_end_clean(void);
?>


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

使用輸出控制來壓縮PHP輸出
你必須使用PHP4里編譯的Zlib擴(kuò)展包來壓縮輸出。如果需要的話,可以查看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!");
?>


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

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


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


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

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


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


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

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


<?php
//告訴瀏覽器將要收到的是gzip數(shù)據(jù)
//當(dāng)然在此之前,你已經(jīng)檢查了它們是否支持gzip,x-gzip數(shù)據(jù)格式
//如果支持的是x-gzip,那么下面的頭就要用z-gzip來代替
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ù)會被送出,
//但是卻不完整。文件最后的四個字節(jié)是CRC校驗(yàn)碼,可是只發(fā)出去了三個字節(jié)。
//最后一個字節(jié)被丟掉了。我不知道這個bug在4.0.2版中解決了沒有,
//不過好避免錯誤的方法是把正確的CRC校驗(yàn)碼加到壓縮的數(shù)據(jù)的末尾。
//
//把舊的CRC校驗(yàn)碼剝離
$contents = substr($contents, 0, strlen($contents) - 4);

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

//輸出CRC,和原來數(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í)際的測試,所有的腳本代碼如下:

復(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還沒問世,我不得不使用PHP3的時候,我對開發(fā)一些緩存機(jī)制來減少數(shù)據(jù)庫的載入、對文件系統(tǒng)的存取十分感興趣。在PHP3中沒有什么特別好的方法,但是有了輸出緩存之后,在PHP4中一切變得容易多了。
這有一個簡單的例子:

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


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

if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file"))) {
//is_valid函數(shù)驗(yàn)證緩存,你可以用這個函數(shù)檢查Cache是否過期或其他特定的條件。
//如果文件不在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);
}

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

?>


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

結(jié)論

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

感謝各位的閱讀!關(guān)于“如何控制PHP輸出緩存并壓縮動態(tài)頁面”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

文章題目:如何控制PHP輸出緩存并壓縮動態(tài)頁面-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://jinyejixie.com/article6/dcgsog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、微信公眾號虛擬主機(jī)、商城網(wǎng)站、用戶體驗(yàn)、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
霍林郭勒市| 南汇区| 蒙自县| 丽江市| 双鸭山市| 桐城市| 灯塔市| 信宜市| 大同县| 金山区| 杂多县| 大兴区| 墨江| 金乡县| 淮南市| 仙桃市| 佳木斯市| 萨嘎县| 二连浩特市| 松原市| 民县| 赤水市| 卓资县| 上饶县| 天柱县| 山阳县| 夏河县| 阿克陶县| 辰溪县| 钦州市| 城口县| 成都市| 文登市| 娄底市| 鄄城县| 平阴县| 内丘县| 凯里市| 双桥区| 开鲁县| 景洪市|