PHP Warning: ob_start(): output handler 'ob_gzhandler' conflicts with 'zlib output compression' in ...
// 或
output handler 'ob_gzhandler' conflicts with 'zlib output compression'
同時啟用了兩種 GZIP 壓縮方式:
zlib.output_compression = On (php.ini 全局壓縮)ob_start('ob_gzhandler') (代碼級輸出緩衝壓縮)兩者嘗試對同一輸出流進行雙重壓縮,導致衝突。
; php.ini
zlib.output_compression = Off
; zlib.output_compression_level = -1
; 代碼中使用 ob_gzhandler
ob_start('ob_gzhandler');
; php.ini
zlib.output_compression = On
zlib.output_compression_level = 6 ; 1-9, 6 平衡
; 代碼中移除 ob_start('ob_gzhandler')
// ob_start(); // 普通緩衝即可
<?php
// 在任何輸出前
ini_set('zlib.output_compression', '0'); // 關閉 zlib 壓縮
ob_start('ob_gzhandler'); // 啟用 ob_gzhandler
// 或反向
ini_set('zlib.output_compression', '1');
ini_set('zlib.output_compression_level', '6');
ob_start(); // 不要用 ob_gzhandler
?>
| 特性 | zlib.output_compression | ob_gzhandler |
|---|---|---|
| 作用範圍 | 全局 (所有 PHP 腳本) | 單腳本/局部 |
| 配置位置 | php.ini / .htaccess | PHP 代碼 |
| 壓縮時機 | 輸出緩衝刷新時 | ob_flush/腳本結束時 |
| 條件判斷 | 自動檢測 Accept-Encoding | 自動檢測 Accept-Encoding |
| 靈活性 | 低 | 高 (可條件啟用) |
| 性能 | 略好 (C層) | 略低 (PHP層) |
# Nginx 配置 (推薦,性能最好,脫離 PHP)
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# Apache 配置 (mod_deflate)
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
# 啟動內置服務器 (不支持 gzip)
php -S localhost:8000
# 生產環境絕不使用內置服務器
# curl 測試
curl -H "Accept-Encoding: gzip,deflate" -I https://example.com/
# 應包含:Content-Encoding: gzip
# 瀏覽器 F12 Network → Response Headers
# Content-Encoding: gzip
# Vary: Accept-Encoding