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_BLOCK, ZLIB_NO_FLUSH, ZLIB_PARTIAL_FLUSH, ZLIB_SYNC_FLUSH(默认),ZLIB_FULL_FLUSH, ZLIB_FINISH。通常您希望设置为 ZLIB_NO_FLUSH 以最大限度地压缩,并设置为 ZLIB_FINISH 以使用最后一部分数据终止。有关这些常量的详细描述,请参阅 » zlib 手册

返回值

返回解压缩的数据块,或在失败时返回 false

错误/异常

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

变更日志

版本 描述
8.0.0 context 现在期望一个 InflateContext 实例;之前,期望一个 resource

参见

添加笔记

用户贡献笔记 1 笔记

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