解压缩的gzip用在stream_filter_append和stream_copy_to_stre

2019-09-21 04:18发布

发现这一点: https://stackoverflow.com/a/11373078/530599 -伟大的,但

怎么样stream_filter_append($fp, 'zlib.inflate', STREAM_FILTER_*

寻找另一种方式来解压缩数据。

$fp = fopen($src, 'rb');
$to = fopen($output, 'wb');

// some filtering here?
stream_copy_to_stream($fp, $to);
fclose($fp);
fclose($to);

其中$src是一些网址http://.../file.gz例如200 + MB :)

加入的测试代码的作品,但在2个步骤:

<?php

    $src = 'http://is.auto.ru/catalog/catalog.xml.gz';
    $fp = fopen($src, 'rb');
    $to = fopen(dirname(__FILE__) . '/output.txt.gz', 'wb');
    stream_copy_to_stream($fp, $to);
    fclose($fp);
    fclose($to);

    copy('compress.zlib://' . dirname(__FILE__) . '/output.txt.gz', dirname(__FILE__) . '/output.txt');

Answer 1:

一个在PHP的流过滤器子系统恼人的遗漏是缺乏一个gzip滤波器。 gzip的基本上是内容使用deflate方法压缩。 它瘪数据之前添加2字节的报头,但是,并在最后一个阿德勒-32校验和。 如果你只需要加一个zlib.inflate过滤器流,它是行不通的。 你必须安装过滤器之前跳过前两个字节。

请注意,有一个与在PHP版本5.2.X.流过滤器一个严重的错误 这是由于流缓冲。 基本上PHP将不能在流的内部缓冲器通过过滤器已传递数据。 如果你做的fread($处理,2)安装在充气过滤器前阅读gzip头,有一个很好的机会,它会失败。 以FREAD()的调用将导致PHP尝试以填补它的缓冲区。 即使调用fread()请求只有两个字节,PHP实际上可能会读更多的字节(让说,1024)在试图提高性能的物理介质。 由于上述缺陷,额外的1022个字节数据将不会被发送到解压缩程序。



Answer 2:

尝试gzopen这将打开一个gzip(。广州)文件进行读取或写入。 如果文件没有压缩,它透明地读取它,所以你可以安全地读取非gzip压缩的文件。

$fp = gzopen($src, 'rb');
$to = fopen($output, 'w+b');
while (!feof($fp)) {
    fwrite($to, gzread($fp, 2048)); // writes decompressed data from $fp to $to
}

fclose($fp);
fclose($to);


文章来源: uncompressing gzip with stream_filter_append and stream_copy_to_stream
标签: php stream zlib