✅ 方法一:使用 ob_start()
手动压缩输出
<?php
// 开启输出缓冲并启用 GZIP 压缩
ob_start('ob_gzhandler');
// 设置响应头
header('Content-Type: application/json');
header('Content-Encoding: gzip');
// 模拟接口数据
$data = ['status' => 'success', 'message' => 'Hello, compressed world!', 'data' => range(1, 1000)];
// 输出 JSON
echo json_encode($data);
// 刷新缓冲区
ob_end_flush();
?>
✅ 方法二:使用 Apache/Nginx 配置自动压缩(推荐)
如果你使用 Apache 或 Nginx,可以在服务器层启用压缩,无需修改 PHP 代码。
Apache (.htaccess
或 httpd.conf
)
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE application/json
</IfModule>
Nginx (nginx.conf
)
location ~ \.php$ {
gzip on;
gzip_types application/json;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
}
✅ 方法三:手动压缩 JSON 并设置头(不推荐,除非特殊场景)
<?php
$data = json_encode(['status' => 'success', 'data' => range(1, 1000)]);
$compressed = gzencode($data, 9); // 9 是压缩级别
header('Content-Type: application/json');
header('Content-Encoding: gzip');
header('Content-Length: ' . strlen($compressed));
echo $compressed;
?>
⚠️ 注意事项
- 客户端必须支持 gzip:大多数现代浏览器和 HTTP 客户端(如
curl -H "Accept-Encoding: gzip"
)都支持。 - 不要重复压缩:如果服务器已经启用了 gzip,PHP 中就不要再用
ob_gzhandler
或gzencode()
,否则会双重压缩导致错误。 - 调试时检查响应头:bash复制
curl -I -H "Accept-Encoding: gzip" https://your-api.com/endpoint
应看到:Content-Encoding: gzip
✅ 推荐做法
- 生产环境:优先用 Apache/Nginx 配置压缩,PHP 端无需处理。
- 临时测试:可以用
ob_start('ob_gzhandler')
快速验证。
文章评论