PHP Conference Japan 2024

inflate_add

(PHP 7, PHP 8)

inflate_add增量地解压缩编码数据

说明

inflate_add(InflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string|false

在指定的 context 中增量地解压缩编码数据。

限制:来自 GZIP 压缩数据的头部信息不可用。

参数

context

使用 inflate_init() 创建的上下文。

data

一段压缩数据。

flush_mode

ZLIB_BLOCKZLIB_NO_FLUSHZLIB_PARTIAL_FLUSHZLIB_SYNC_FLUSH (默认),ZLIB_FULL_FLUSHZLIB_FINISH 之一。通常,你会将 ZLIB_NO_FLUSH 设置为最大化压缩,并将 ZLIB_FINISH 设置为使用最后一段数据终止。有关这些常量的详细说明,请参阅 » zlib 手册

返回值

返回一段未压缩的数据,失败时返回 false

错误/异常

如果给出了无效的参数,解压缩数据需要预设字典,但未指定字典,压缩流损坏或具有无效的校验和,则会生成级别为 E_WARNING 的错误。

更新日志

版本 说明
8.0.0 context 现在需要一个 InflateContext 实例;之前,需要一个 资源

参见

添加注释

用户贡献的注释 1 条注释

0
burp at -only-in-German-fuerspam dot de
1 年前
如何使用它进行_增量_解压缩并不明显
你将_压缩数据_分成_小块_馈送到 inflate_add() 中。
zlib 上下文的内部状态将确保你可以在任何点分割并仍然获得正确的总数据,只要你一直读取到结束。

通过这种方式,你不必在任何时候将完整的未压缩数据保存在内存中(也不必将其具体化为 gzopen() 等的文件),从而允许你解析比可用 php 内存限制大得多的文件。

<?php
/* 一个好的步长取决于输入的压缩级别,
不幸的是,没有明显的方法可以预先知道;
如果有疑问,请选择一个较小的值并将片段粘合在一起,
直到有足够的数据进行处理 */
$step = 500000;

$dataGz = load_gzip_compressed_data_to_string();

$start = 0;
$outLen = 0;
$ctxt = inflate_init(ZLIB_ENCODING_GZIP);
$status = inflate_get_status($inflCtxt);

while(
$status == ZLIB_OK) {
$split = substr($dataGz, $start, $step);
$dataFragment = inflate_add($inflCtxt, $split);
/* 处理片段,可能会在迭代中保留部分 */
$outLen += strlen($dataFragment);
$status = inflate_get_status($inflCtxt);
$start += $step;
}
echo
'输入:' . strlen($dataGz) . ' 字节 / 输出:' . $outLen . ' 字节。';
?>

注意:极高压缩的归档文件仍然会因为愚蠢且不必要的内存耗尽而失败,因为无法在 inflate_init() 中定义类似于 gzuncompress() 的限制。
To Top