php緩衝並壓縮動態網頁面的技巧詳解

來源:互聯網
上載者:User
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, 或其他你喜歡的方法產生所有輸出內容,例如:

<?phpprint("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擴充可以很好地完成這個任務。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.