本文目录导读:

在 PHP 中实现响应压缩,主要有两种方式:自动压缩(推荐) 和 手动压缩。
自动压缩(最简单推荐)
在 php.ini 或服务器配置中开启:
修改 php.ini
zlib.output_compression = On zlib.output_compression_level = 6
zlib.output_compression = On:启用输出压缩zlib.output_compression_level:压缩级别(1-9,6 是平衡值)
在 PHP 代码中动态设置
<?php
ini_set('zlib.output_compression', 'On');
ini_set('zlib.output_compression_level', 6);
// 之后的输出会被自动压缩
优点:不用修改代码,自动处理所有输出
缺点:需要在服务器层面配置
手动压缩(更灵活)
使用 ob_gzhandler() 回调函数:
<?php
// 在输出任何内容之前设置
ob_start('ob_gzhandler');
// 所有输出都会自动压缩
echo "Hello, World!";
echo str_repeat("A", 10000); // 大内容也会被压缩
ob_end_flush();
工作原理:
ob_gzhandler会检查浏览器是否支持 gzip- 如果不支持,自动输出未压缩内容
- 支持则输出 gzip 压缩内容
完整示例(手动控制)
<?php
// 检查客户端是否支持 gzip
if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'] ?? '', 'gzip') !== false) {
ob_start('ob_gzhandler');
} else {
ob_start();
}
// 设置合适的 Content-Type
header('Content-Type: text/html; charset=utf-8');
echo "这是一个测试页面";
echo str_repeat("内容压缩测试 ", 500); // 生成大量重复内容
// 输出缓冲区内容并结束
ob_end_flush();
压缩大文件/响应
对于超大响应,建议分块压缩:
<?php
function compressOutput($content) {
if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'] ?? '', 'gzip') !== false) {
$compressed = gzencode($content, 6);
header('Content-Encoding: gzip');
header('Content-Length: ' . strlen($compressed));
return $compressed;
}
return $content;
}
$largeContent = str_repeat("Some long content ", 10000);
// 手动压缩并输出
echo compressOutput($largeContent);
验证是否生效
浏览器开发者工具
- 打开 Chrome/Firefox 开发者工具 → Network
- 查看请求的 Response Headers
- 如果看到:
Content-Encoding: gzip✅ 压缩生效- 没有这个 header ❌ 未压缩
用 curl 测试
curl -H "Accept-Encoding: gzip" -I https://your-site.com
查看返回的 headers 中是否有 Content-Encoding: gzip。
注意事项
| 场景 | 建议 |
|---|---|
| 共享主机 | 使用 ob_gzhandler(大多数主机支持) |
| 专用服务器 | 在 php.ini 或 Nginx/Apache 层面开启 |
| API 接口 | 手动检查 Accept-Encoding 再决定是否压缩 |
| 已压缩资源 | 图片、视频等不要再压缩(浪费时间) |
- 简单快速:在 php.ini 开启
zlib.output_compression = On - 灵活控制:用
ob_start('ob_gzhandler') - 强力推荐:直接在 Web 服务器层面(Nginx/Apache)开启 gzip,比 PHP 层面更高效
如果你用的是 Nginx,建议在 Nginx 配置中开启 gzip,性能最好:
gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
这样 PHP 代码完全不需要改,服务器自动压缩。