首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 啟用 GZIP 頁面壓縮的兩種方法:ob_gzhandler 與自訂回調函式

     編輯:PHP 相關知識

為何啟用 GZIP?

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)

修改 `php.ini` 或專案根目錄 `.user.ini`:

zlib.output_compression = On
zlib.output_compression_level = 6
; zlib.output_handler = ; 留空即用內建

此法無需修改程式碼,對全站生效,但無法針對單一頁面關閉。

常見坑與驗證

  • 輸出前不可有任何輸出(含 BOM、空白、echo),否則 `headers_sent()` 為真,壓縮失效。
  • 驗證方式:瀏覽器開發者工具 Network 標籤 → 查看 Response Headers 是否含 `Content-Encoding: gzip`。
  • 圖片/二進位檔:已壓縮格式(JPG/PNG/PDF/MP4)不再壓縮,避免浪費 CPU。
  • Nginx/Apache 層壓縮:生產環境建議由 Web Server (gzip/mod_deflate) 處理,效能優於 PHP 層。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved