PHP 7.2 通过Web服务器(如Apache mod_deflate)或脚本内ob_start('ob_gzhandler')实现Gzip压缩,需禁用zlib.output_compression避免双重压缩,并验证响应头含Content-Encoding: gzip。

PHP 7.2 本身不直接执行 Gzip 压缩,而是通过输出控制机制或配合 Web 服务器(如 Apache、Nginx)来实现。关键在于:**压缩发生在响应发送前,且必须避免重复压缩(否则会出错)**。以下是针对 PHP 7.2 的几种可靠配置方式,按推荐优先级排序。
优先用 Web 服务器压缩(Apache + mod_deflate)
这是最稳定、性能最优的方式,尤其适合 PHP 7.2 运行在 Apache 上的环境。
- 确认已启用
mod_deflate和mod_headers模块(phpStudy 或 Linux 下可用a2enmod deflate headers) - 在
.htaccess或虚拟主机配置中添加:
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json
</IfModule>
<IfModule mod_headers.c>
Header append Vary Accept-Encoding
</IfModule>
# 强制对所有 .php 文件启用压缩(绕过 Content-Type 判断)
<FilesMatch "\.php$">
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>-
务必关闭 PHP 自身压缩:编辑
php.ini,确保zlib.output_compression = Off,并删除或注释掉任何ini_set('zlib.output_compression', ...)调用 - 重启 Apache 生效
PHP 脚本内启用(兼容共享主机)
当无法修改服务器配置时,可在 PHP 7.2 脚本开头使用输出缓冲控制。
- 仅在需要压缩的页面顶部加入(必须在任何输出之前):
<?php
if (extension_loaded('zlib') && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) {
ob_start('ob_gzhandler');
} else {
ob_start();
}
?>- 该方式依赖
zlib扩展(PHP 7.2 默认已编译,可通过phpinfo()确认) - 不要同时开启
zlib.output_compression,否则会触发双重压缩导致浏览器解码失败 - 不适用于输出二进制内容(如图片、PDF)的脚本
修改 php.ini 全局启用(慎用)
虽简单,但在 PHP 7.2 中不推荐作为首选,易与服务器层冲突。
立即学习“PHP免费学习笔记(深入)”;
- 找到 PHP 7.2 对应的
php.ini(用php --ini或phpinfo()查看路径) - 设置以下两项:
zlib.output_compression = On zlib.output_compression_level = 6
- 重启 Web 服务(Apache/Nginx + PHP-FPM)
- 注意:若服务器已用 mod_deflate 或 Nginx gzip,则必须禁用此项,否则返回
ERR_CONTENT_DECODING_FAILED
验证是否生效
无论采用哪种方式,都需实际验证:
- 用浏览器开发者工具 → Network → 刷新页面 → 点击一个 PHP 请求 → 查看 Response Headers
- 成功标志:
Content-Encoding: gzip和Vary: Accept-Encoding - 命令行快速检测:
curl -I -H "Accept-Encoding: gzip" http://yoursite.com/test.php



















