3

我一直在构建一个类来在 PHP 中创建 ZIP 文件。ZipArchive 的替代方案,假设它在服务器中是不允许的。与那些免费服务器一起使用的东西。

它已经开始工作了,使用 PHP 构建 ZIP 结构,并使用 gzdeflate() 生成压缩数据。

问题是,gzdeflate() 要求我将整个文件加载到内存中,并且我希望类的工作限制在 32MB 的内存中。目前它存储的文件大于 16MB,完全没有压缩。

我想我应该让它压缩数据块,16MB x 16MB,但我不知道如何连接两个 gzdeflate() 的结果。

我一直在测试它,它似乎需要在最后 16 位中进行一些数学运算,有点buff->last16bits = (buff->last16bits & newblock->first16bits) | 0xfffe,它有效,但不适用于所有样本......

问题:如何在不解压缩的情况下连接两个 DEFLATEd 流?

4

2 回答 2

1

PHP 流过滤器用于执行此类任务。stream_filter_append可以在读取或写入流时使用。例如

    $fp = fopen($path, 'r');
    stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_READ);

现在fread将返回您的压缩数据。

于 2012-11-09T15:44:30.800 回答
0

这可能有帮助,也可能没有帮助。看起来 gzwrite 将允许您写入文件而无需将它们完全加载到内存中。PHP 手册页中的这个示例展示了如何使用 gzwrite 和 fopen 压缩文件。

http://us.php.net/manual/en/function.gzwrite.php

function gzcompressfile($source,$level=false){
    // $dest=$source.'.gz';
    $dest='php://stdout'; // This will stream the compressed data directly to the screen.
    $mode='wb'.$level;
    $error=false;
    if($fp_out=gzopen($dest,$mode)){
        if($fp_in=fopen($source,'rb')){
            while(!feof($fp_in))
                gzwrite($fp_out,fread($fp_in,1024*512));
            fclose($fp_in);
            }
          else $error=true;
        gzclose($fp_out);
        }
      else $error=true;
    if($error) return false;
      else return $dest;
}
于 2009-09-09T16:31:40.863 回答