HTTP 傳輸前壓縮 HTML/CSS/JS 可大幅減少頻寬(通常 70-90% 壓縮率),加快頁面載入速度,提升 SEO 與用戶體驗。PHP 提供內建支援,極易啟用。
ob_gzhandler(推薦)在腳本最開頭(任何輸出前)加入:
<?php
if (extension_loaded('zlib')) {
ob_start('ob_gzhandler');
}
?>
...頁面內容...
<?php
if (extension_loaded('zlib')) {
ob_end_flush();
}
?>
原理:`ob_gzhandler` 自動檢測瀏覽器 `Accept-Encoding: gzip`,符合條件則壓縮並發送 `Content-Encoding: gzip` 標頭,不支援則原文輸出。
<?php
ob_start('ob_gzip');
function ob_gzip($content) {
// 條件:未發送標頭、zlib 已載入、瀏覽器支援 gzip
if (!headers_sent() && extension_loaded('zlib') &&
strpos($_SERVER['HTTP_ACCEPT_ENCODING'] ?? '', 'gzip') !== false) {
$content = gzencode($content, 9); // 9 = 最高壓縮等級
header('Content-Encoding: gzip');
header('Vary: Accept-Encoding');
header('Content-Length: ' . strlen($content));
}
return $content;
}
?>
...頁面內容...
<?php ob_end_flush(); ?>
| 特性 | ob_gzhandler | 自訂 ob_gzip |
|---|---|---|
| 程式碼量 | 極少(2 行) | 約 15 行 |
| 壓縮等級控制 | 固定預設值 | 可調 (1-9) |
| 條件判斷自訂 | 內建邏輯 | 完全可控 |
| 適用場景 | 大多數專案、快速接入 | 需特殊邏輯(如排除特定 UA、AJAX 不壓縮) |
修改 `php.ini` 或專案根目錄 `.user.ini`:
zlib.output_compression = On
zlib.output_compression_level = 6
; zlib.output_handler = ; 留空即用內建
此法無需修改程式碼,對全站生效,但無法針對單一頁面關閉。