php接口接收gzip压缩请求体时,需先检查$_server['http_content_encoding']是否为gzip,再用gzdecode()解压php://input原始数据,否则$_post和json_decode()会失败;响应端推荐用ob_start('ob_gzhandler')启用自动gzip压缩。

PHP接口接收gzip压缩数据怎么解压
客户端用gzip压缩后发给PHP接口,$_POST和file_get_contents('php://input')都拿不到原始数据——因为PHP默认不自动解压请求体。必须手动处理。
常见错误现象:json_decode(file_get_contents('php://input'), true) 返回 null,但strlen()显示有数据,说明是二进制压缩流没解码。
- 先检查
$_SERVER['HTTP_CONTENT_ENCODING']是否为gzip(注意大小写,有些客户端发GZIP) - 用
gzdecode()解压原始输入流,不是gzuncompress()或gzinflate()——它们对应不同压缩格式,错用会返回false - 解压失败时
gzdecode()返回false,需判空并给出明确错误提示,比如http_response_code(400); echo 'Invalid gzip data';
$raw = file_get_contents('php://input');
if (isset($_SERVER['HTTP_CONTENT_ENCODING']) && strtolower($_SERVER['HTTP_CONTENT_ENCODING']) === 'gzip') {
$raw = @gzdecode($raw);
if ($raw === false) {
http_response_code(400);
die('gzip decode failed');
}
}
$data = json_decode($raw, true);
PHP怎么让接口响应也支持gzip压缩
不是所有客户端都主动声明Accept-Encoding: gzip,但只要服务端开了zlib.output_compression,PHP会自动压缩输出——但这会影响header()调用时机,容易报“headers already sent”。
- 推荐用
ob_gzhandler配合ob_start(),更可控:ob_start('ob_gzhandler');放在脚本最开头(甚至比session_start()还早) - 如果已启用
zlib.output_compression=On(php.ini里),就别再手动gzencode()响应体,否则会双重压缩,客户端无法解压 - 注意:
Content-Length头不能手动设,因为压缩后长度不确定;PHP会自动计算并覆盖
解压失败的几个典型原因和排查点
不是所有“看着像gzip”的数据都能被gzdecode()吃掉。常见踩坑点集中在协议层和编码细节上。
- 前端用
fetch发body: new Blob([JSON.stringify(obj)], {type: 'application/json'})再加headers: {'Content-Encoding': 'gzip'}——这不行,Blob本身没压缩,只是谎报了头 - cURL命令里用了
-H 'Content-Encoding: gzip'但没真压缩数据,应改用--data-binary '@file.gz'传入已压缩文件 - PHP版本低于5.4不支持
gzdecode(),得用gzinflate(substr($data, 10))手动剥去gzip头(10字节),但极不推荐——兼容性差且易出错 - 某些SDK(如微信小程序request)对
Content-Encoding头敏感,即使服务端没压缩,它也可能尝试解压,导致乱码
要不要在接口里做解压逻辑
除非明确知道客户端稳定发送gzip数据,否则不建议在通用接口里默认解压。解压是CPU密集操作,可能成为DDoS入口点——攻击者发大量伪造gzip头+垃圾数据,触发反复解压失败重试。
- 生产环境建议只对特定路径(如
/api/v2/upload)或特定User-Agent开启解压逻辑 - 加一层长度限制:
if (strlen($raw) > 5 * 1024 * 1024) { die('Payload too large'); },防内存耗尽 - 日志里记下
$_SERVER['HTTP_CONTENT_ENCODING']和原始长度,方便后续查异常流量
gzip解压看着简单,但实际要盯住客户端行为、PHP版本差异、错误静默和资源消耗四个面,漏一个就可能在线上突然失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











