您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關如何控制PHP輸出緩存并壓縮動態頁面的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
mod_gzip是一個Apache模塊,其功能是使用Gzip壓縮靜態的html頁面,遵循IETF標準的瀏覽器可以接受gzip編碼(IE, Netscape等)。mod_gzip可以將頁面的下載時間提高4-5倍。我強烈建議你在你的web服務器上使用mod_gzip。然而,我們還必須用PHP建立我們自己的壓縮引擎。在這篇文章里,我將要介紹如何使用PHP的輸出控制函數來大幅加速頁面載入速度。
介紹PHP的輸出控制函數
PHP4中最令人滿意的事是——你可以讓PHP緩存所有由腳本生成的輸出,在你決定把它們送出之前,瀏覽器方是不會收到任何內容的。在腳本程序中你能用這些函數來設置header、cookies,然而這只是強大的輸出函數的一小部分功能。
復制代碼 代碼如下:
<?php
void ob_start(void);
?>
告訴PHP處理器把所有的輸出重定向到一個內部的緩存(buffer)中。在調用ob_start之前,沒有輸出會被送到瀏覽器去。
復制代碼 代碼如下:
<?php
string ob_get_contents(void);
?>
該函數將“輸出緩存”(output buffer)以字符串的形式返回。你可以調用該函數把積累下來的輸出送到瀏覽器中。(僅在把buffering功能關閉之后!!)
復制代碼 代碼如下:
<?php
int ob_get_length(void);
?>
返回緩存中的字符串的長度。
復制代碼 代碼如下:
<?php
void ob_end_clean(void);
?>
清空輸出緩存,并將輸出緩存關閉。在緩存中的內容輸出到瀏覽器之前,必須使用這個函數。
void 501([int flag])
用來打開/關閉隱含的flush動作開關(默認是關)。如果flush是開的,每次調用print/echo或是其它輸出命令的時候,輸出的內容會被立即送到瀏覽器端。
使用輸出控制來壓縮PHP輸出
你必須使用PHP4里編譯的Zlib擴展包來壓縮輸出。如果需要的話,可以查看PHP文檔中有關Zlib包的安裝指導。
首先,初始化輸出緩存:
復制代碼 代碼如下:
<?php
ob_start();
ob_implicit_flush(0);
?>
之后,用print, echo, 或其他你喜歡的方法生成所有輸出內容,例如:
復制代碼 代碼如下:
<?php
print("Hey this is a compressed output!");
?>
頁面生成后,我們取回輸出內容:
復制代碼 代碼如下:
<?php
$contents = ob_get_contents();
ob_end_clean();
?>
之后,必須檢測瀏覽器是否支持壓縮數據。如果支持,瀏覽器會發給服務器端一個ACCEPT-ENCODEING HTTP頭。我們只需檢查$HTTP_ACCEPT_ENCODING變量中是否有“gzip,deflate”字串。
復制代碼 代碼如下:
<?php
if(ereg('gzip, deflate',$HTTP_ACCEPT_ENCODING)) {
// 在這里生成 Gzip 壓縮的內容
} else {
echo $contents;
}
?>
這種方法使用起來既簡單又結構清晰。下面讓我們看看如何生成壓縮的輸出:
復制代碼 代碼如下:
<?php
//告訴瀏覽器將要收到的是gzip數據
//當然在此之前,你已經檢查了它們是否支持gzip,x-gzip數據格式
//如果支持的是x-gzip,那么下面的頭就要用z-gzip來代替
header("Content-Encoding: gzip");
//顯示gzip文件的頭
//只需顯示一次
echo "x1fx8bx08x00x00x00x00x00";
//計算出文件的大小和CRC碼
$Size = strlen($contents);
$Crc = crc32($contents);
//壓縮數據
$contents = gzcompress($contents, 9);
//我們不能就這樣輸出,因為CRC碼是混亂的。
//如果我在這里使用“echo $contents”,壓縮的數據會被送出,
//但是卻不完整。文件最后的四個字節是CRC校驗碼,可是只發出去了三個字節。
//最后一個字節被丟掉了。我不知道這個bug在4.0.2版中解決了沒有,
//不過最好避免錯誤的方法是把正確的CRC校驗碼加到壓縮的數據的末尾。
//
//把舊的CRC校驗碼剝離
$contents = substr($contents, 0, strlen($contents) - 4);
//僅顯示壓縮的數據
echo $contents;
//輸出CRC,和原來數據的大小(字節)
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
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輸出
當PHP4還沒問世,我不得不使用PHP3的時候,我對開發一些緩存機制來減少數據庫的載入、對文件系統的存取十分感興趣。在PHP3中沒有什么特別好的方法,但是有了輸出緩存之后,在PHP4中一切變得容易多了。
這有一個簡單的例子:
復制代碼 代碼如下:
<?php
//為請求的URI構造一個文件名
$cached_file=md5($REQUEST_URI);
if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file"))) {
//is_valid函數驗證緩存,你可以用這個函數檢查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);
?>
這是一個簡單的例子,使用輸出緩存,你可以建立一個復雜的內容生成系統,對不同的塊或程序使用不同的緩存機制,等等……
結論
PHP輸出控制函數對把腳本生成的輸出重定向到緩存中十分有用。為支持gzip的瀏覽器輸出壓過的緩存數據可以減少載入時間。也可作為緩存機制來減少對數據源的存取(數據庫或文件),這對使用XML意義重大。
如果我們用PHP建立一個引擎,緩存從數據源得到的數據(xml文檔和數據庫),并且動態的生成XML格式的內容(沒有外觀-presentation)我們可以得到這些XML的輸出,并使用XSLT轉換成任意一種我們想要的外觀格式(html, wap, palm, pdf等)。使用PHP4的輸出緩存和Sablotron XSLT擴展可以很好地完成這個任務。
感謝各位的閱讀!關于“如何控制PHP輸出緩存并壓縮動態頁面”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。