代码之家  ›  专栏  ›  技术社区  ›  Havenard

gzdeflate()和大量数据

  •  3
  • Havenard  · 技术社区  · 15 年前

    我一直在构建一个用PHP创建zip文件的类。假设服务器中不允许使用ZipArchive,则是另一种方法。与那些免费服务器一起使用的东西。

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

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

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

    我一直在测试它,它似乎需要在最后16位进行一些数学运算,有点像 buff->last16bits = (buff->last16bits & newblock->first16bits) | 0xfffe ,它是有效的,但不是所有的样品…

    问题:如何连接两个放气流而不进行减压?

    2 回复  |  直到 12 年前
        1
  •  1
  •   Naveed    12 年前

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

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

    现在 fread 将返回放气数据。

        2
  •  0
  •   Dooltaz    15 年前

    这可能有帮助,也可能没有帮助。看起来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;
    }
    
    推荐文章