Gzip 是流行檔案壓縮演算法,應用極廣,尤其在 Linux 平台。對純文字檔套用 Gzip 效果顯著,約減少 70% 以上檔案大小(視內容而定)。
利用 Apache Gzip 模組,可用 Gzip 壓縮演算法壓縮 Apache 發布的網頁內容再傳輸至客戶端瀏覽器。實際降低網路傳輸位元組數,最明顯好處:加快網頁載入速度。
加快載入速度好處不言而喻:省流量、改善瀏覽體驗外,潛在好處是 Gzip 與搜尋引擎抓取工具關係更好。如 Google 可直接讀取 gzip 檔比手工抓取更快檢索網頁。Google 站長工具中 sitemap.xml.gz 直接作為 Sitemap 提交。
不限靜態內容,PHP 動態頁面與其他動態生成內容均可經 Apache 壓縮模組壓縮,配合其他效能調整與伺服器端快取規則,大幅提升網站效能。
建議:部署於 Linux 伺服器的 PHP 程式,在伺服器支援下,啟用 Gzip Web 壓縮。
未使用 Gzip:
開啟 Gzip 後:
Apache 利用 Gzip 壓縮的模組有兩種:mod_gzip 和 mod_deflate。啟用 Gzip Web 壓縮,請先確定伺服器支援兩者之一。Linux 伺服器上,越來越多空間商開放支援,甚至同時支援兩者(如 GoDaddy、Bluehost、DreamHost)。
雖需客戶端瀏覽器支援,但現代瀏覽器(IE、Firefox、Opera、Chrome)多已支援。查看 HTTP 標頭可快速判斷:
Accept-Encoding: gzip → 支援 mod_gzipAccept-Encoding: deflate → 支援 mod_deflateAccept-Encoding: gzip,deflate → 同時支援伺服器支援 Gzip 組件時,可在 httpd.conf 或 .htaccess 定制。.htaccess 簡單實例:
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>
<ifmodule mod_deflate.c>
DeflateCompressionLevel 6 #壓縮率, 6為建議值
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE image/svg+xml
</ifmodule>
MIME 類型可按需添加。PDF、圖片、音樂等本身高度壓縮格式,重複壓縮作用小,反而可能因增加 CPU 處理時間及瀏覽器渲染問題降低效能,無需 Gzip 壓縮。
配置後查看回傳 HTTP 標頭,出現 Content-Encoding: gzip 表明資料已壓縮,Gzip 生效。(無論用 mod_gzip 或 mod_deflate,回傳資訊相同,因均實現 gzip 壓縮)。
亦可用線上檢測工具(如 whatsmyip.org)檢測。
DeflateCompressionLevel 設定壓縮等級(1 最快/最低品質 ~ 9 最慢/最高壓縮率,預設 6 平衡值),這讓 mod_deflate 輕鬆媲美 mod_gzip 壓縮率。虛擬空間未啟用上述模組,可退而求其次用 PHP zlib 函數庫(同樣需查看伺服器支援)壓縮檔案,但較麻煩且一般較耗資源,請謹慎使用。
可考慮兩種方式:開啟 zlib.output_compression 或用 ob_gzhandler 編碼。
zlib.output_compression:壓縮同時發送資料至客戶端。
ob_gzhandler:待壓縮完畢後發送。前者效率更高,但兩者不能同時用,只能擇一,否則報錯。
針對 GoDaddy Deluxe Hosting Linux 空間簡述實現:
預設 zlib.output_compression 關閉。編輯 php5.ini 加入:
zlib.output_compression = On
zlib.output_compression_level = 6
上傳至 FTP 根目錄,等待生效(需一段時間),用 phpinfo() 檢測:
Directive | Local Value | Master Value
zlib.output_compression | On | On
zlib.output_compression_level | 6 | 6
Local 與 Master 均為 On 即生效,訪問 PHP 頁面(含偽靜態)已 GZIP 壓縮,Firebug 或線上工具可檢測。
若用 ob_gzhandler,需關閉 zlib.output_compression,改 php5.ini:
zlib.output_compression = Off
zlib.output_compression_level = -1
ob_gzhandler 為 GoDaddy 官網推薦用法,在 PHP 檔案頂部插入代碼實現 GZIP:
<?php
if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'))
ob_start("ob_gzhandler");
else
ob_start();
?>
無論 zlib.output_compression 或 ob_gzhandler,僅能對 PHP 檔 GZIP 壓縮,HTML/CSS/JS 等靜態檔只能透過調用 PHP 方式實現。
最後提醒:主流瀏覽器預設 HTTP 1.1 協定,基本支援 GZIP。IE 若未勾選「工具 → 網際網路選項 → 進階 → HTTP 1.1 設定 → 使用 HTTP 1.1」,將感受不到壓縮帶來的速度提升!