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

PHP 字符串壓縮函數性能比較:gzcompress、gzencode、gzdeflate、bzcompress

     編輯:PHP 相關知識

四大壓縮函數對比

函數算法輸出格式解壓函數典型場景
gzcompressZLIB (DEFLATE)ZLIB 數據流 (RFC 1950)gzuncompress通用字符串壓縮、緩存存儲
gzencodeZLIB (DEFLATE)GZIP 文件格式 (RFC 1952,含頭尾校驗)gzdecode (PHP 5.4+)HTTP 響應壓縮、.gz 文件生成
gzdeflate原始 DEFLATE裸 DEFLATE 數據流 (RFC 1951,無頭尾)gzinflate自定義協議、嵌入其他容器
bzcompressBurrows-Wheeler (bzip2)bzip2 格式bzdecompress高壓縮比需求、大文本存檔

基準測試代碼

<?php
$str_zh = '布局 1 介紹 布局,簡單來說就是設置元素的大小和位置。 Ext 的布局系統包括組件,布局,容器...'; // 328 字節
$str_en = '!@#$%^&*()QWERTYUIOPSDFGHJKL...'; // 386 字節

function bench($func, $data, $level = 9, $times = 1000) {
    $start = microtime(true);
    for ($i = 0; $i < $times; $i++) {
        $compressed = $func($data, $level);
    }
    $compressTime = microtime(true) - $start;

    $start = microtime(true);
    for ($i = 0; $i < $times; $i++) {
        // 解壓函數映射
        $decompress = ['gzcompress'=>'gzuncompress', 'gzencode'=>'gzdecode', 'gzdeflate'=>'gzinflate', 'bzcompress'=>'bzdecompress'];
        $decompress($compressed);
    }
    $decompressTime = microtime(true) - $start;

    return [
        'size' => strlen($compressed),
        'compress_ms' => round($compressTime * 1000, 2),
        'decompress_ms' => round($decompressTime * 1000, 2),
    ];
}

$funcs = ['gzcompress', 'gzencode', 'gzdeflate', 'bzcompress'];
foreach ($funcs as $f) {
    echo "--- $f (中文) ---\n";
    print_r(bench($f, $str_zh));
    echo "--- $f (英文) ---\n";
    print_r(bench($f, $str_en));
}

典型測試結果(1000 次迭代)

函數中文壓縮後大小壓縮耗時解壓耗時英文壓縮後大小壓縮耗時解壓耗時
gzcompress251 B60 ms55 ms116 B50 ms45 ms
gzencode263 B120 ms110 ms128 B100 ms90 ms
gzdeflate245 B120 ms110 ms110 B90 ms85 ms
bzcompress303 B260 ms240 ms183 B210 ms200 ms

結論與建議

  • 速度最快:gzcompress(壓縮/解壓雙冠),適合高頻緩存、RPC 序列化。
  • 壓縮比最高:gzdeflate 體積最小(無頭尾開銷),適合存儲空間敏感場景。
  • 標準兼容:gzencode 生成標準 .gz 文件,Web 服務器可直接發送(Content-Encoding: gzip)。
  • bzcompress:速度最慢、壓縮比中等,**不推薦**用於高頻在線場景,適合離線歸檔。

最佳實踐

  1. Redis/Memcached 緩存值壓縮:用 gzcompress($data, 6)(級別 6 平衡速度/體積),存入時壓縮,取出時 gzuncompress。
  2. API 響應壓縮:Nginx/Apache 開啟 gzip on 由 Web 服務器處理,應用層無需干預。
  3. 大文本字段入庫:gzdeflate 存 BLOB/TEXT,讀取時 gzinflate,節省 70%+ 存儲。
  4. 壓縮級別選擇:1-9,1 最快,9 最小。實時場景用 1-6,離線歸檔用 9。

避坑指南

  • gzdecode 需 PHP 5.4+,舊版本用 gzinflate(substr($gz, 10, -8)) 手動去頭尾。
  • 二進制數據壓縮後可能包含 NUL 字符,資料庫字段用 BLOB 或 VARBINARY,勿用 TEXT。
  • 極短字符串(<50 字節)壓縮後可能**變大**,建議設置長度閾值跳過壓縮。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved