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

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

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

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

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

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

有帮助吗?

解决方案

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

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

现在 fread 会返回泄密的数据。

其他提示

这可能有所帮助,也可能没有帮助。它看起来像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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top