3

PHPでZIPファイルを作成するためのクラスを作成しています。サーバーで許可されていないことを前提としたZipArchiveの代替手段。それらの無料サーバーで使用するもの。

これはすでに機能しており、PHPでZIP構造を構築し、gzdeflate()を使用して圧縮データを生成します。

問題は、gzdeflate()ではファイル全体をメモリにロードする必要があり、クラスを32MBのメモリに制限して動作させたいということです。現在、16MBを超えるファイルを圧縮せずに保存しています。

データを16MBx16MBのブロックに圧縮する必要があると思いますが、2つのgzdeflate()の結果を連結する方法がわかりません。

私はそれをテストしてきましたが、最後の16ビットでいくつかの計算が必要なようです、ある種buff->last16bits = (buff->last16bits & newblock->first16bits) | 0xfffe、それは機能しますが、すべてのサンプルに対してではありません...

質問:解凍せずに2つの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 に答える