PHP字符串解压缩主要用内置函数:gzdecode()解gzip、gzuncompress()解zlib、gzinflate()解原始DEFLATE、zlib_decode()自动识别;需注意格式匹配、Base64预解码及Brotli/Zstandard等扩展支持。

PHP 中字符串解压缩主要依赖内置函数,无需手动实现底层算法(如 DEFLATE、LZ77),但需正确选择函数、处理编码与边界情况。
常用解压缩函数及对应压缩格式
PHP 提供多个开箱即用的解压缩函数,匹配不同压缩方式:
-
gzdecode():解压 gzip 格式(含完整 gzip 头和校验),适用于
gzencode()或 Linuxgzip命令生成的数据 -
gzuncompress():解压原始 zlib 格式(RFC 1950,带 zlib 头),对应
gzcompress() -
gzinflate():解压原始 DEFLATE 数据(RFC 1951,无头无尾),对应
gzdeflate() - zlib_decode():自动识别 zlib 或 gzip 封装(PHP 5.4+),但兼容性略低,建议明确格式时优先用专用函数
典型使用示例与错误规避
解压失败常因格式不匹配或数据损坏。以下为安全解压片段:
// 安全解压 gzip 编码字符串
function safe_gzdecode($data) {
if (!is_string($data) || $data === '') return false;
// 检查是否为 gzip(魔数 1f 8b)
if (substr($data, 0, 2) !== "\x1f\x8b") {
return false; // 格式不符
}
$result = @gzdecode($data);
return $result === false ? false : $result;
}
<p>// 解压 zlib 压缩字符串(如某些 HTTP 响应 body)
function safe_gzuncompress($data) {
if (strlen($data) < 2) return false;
// 检查 zlib 头(CMF + FLG 字节,CM 应为 8 表示 deflate)
$cmf = ord($data[0]);
if (($cmf & 0x0F) !== 0x08) return false;
return @gzuncompress($data);
}处理 Base64 编码的压缩字符串
网络传输中压缩数据常经 Base64 编码。解压前必须先解码:
立即学习“PHP免费学习笔记(深入)”;
- 先用
base64_decode()还原二进制数据 - 再根据原始压缩方式调用对应解压函数(不可跳过解码直接传给
gzdecode) - 注意:
base64_decode()在失败时返回false,需检查
示例:
$raw = base64_decode($encoded);<br>
if ($raw !== false && ($decoded = gzdecode($raw)) !== false) { /* 成功 */ }
扩展支持:Brotli 与 Zstandard(PHP 7.4+)
现代 PHP(7.4 起)可通过 ext-brotli 和 ext-zstd 支持新算法:
- Brotli 解压:
brotili_decompress($data)(需启用brotli扩展) - Zstandard 解压:
zstd_decompress($data)(需启用zstd扩展) - 两者均不内置,需编译安装扩展,且函数行为类似
gzdecode,失败返回false











