gzdeflate () ve büyük miktarda veri

2 Cevap php

Ben PHP ZIP dosyaları oluşturmak için bir sınıf inşa ettik. Varsayarak ZIPARCHIVE alternatif sunucu izin verilmez. Bu ücretsiz sunucular ile kullanmak için bir şey.

Zaten çeşit sıkıştırılmış veri oluşturmak için) (PHP ile ZIP yapılar inşa, çalışma ve gzdeflate kullanıyor.

Sorun gzdeflate () bellekte tüm dosyayı yüklemek için beni gerektirir ve ben çalışmak için sınıf bellek 32MB limitated istiyorum olduğunu. Şu anda hiç bir sıkıştırma ile 16MB daha büyük dosyaları depolamak.

Ben bunu blokları, 16MB ile 16MB veri sıkıştırmak yapmak gerekir hayal, ama ben iki gzdeflate () sonucunu bağlamak için nasıl bilmiyorum.

Bunu test ettik ve bu tür buff->last16bits = (buff->last16bits & newblock->first16bits) | 0xfffe, çalışır, ancak tüm örnekler için, son 16-bit bazı matematik gerektirir gibi görünüyor ...

Question: How to concatenate two DEFLATEd streams without decompressing it?

2 Cevap

Bu veya yardımcı olmayabilir. Gzwrite onları tamamen bellekte yüklü kalmadan dosyaları yazmak için izin verecek gibi görünüyor. PHP Manual sayfasından Bu örnek gzwrite ve fopen kullanarak bir dosyayı sıkıştırmak nasıl gösterir.

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;
}