Frage

Ich habe eine Klasse erstellt, um Zip -Dateien in PHP zu erstellen. Eine Alternative zu Ziparchive unter der Annahme, dass es auf dem Server nicht zulässig ist. Etwas, das mit diesen freien Servern verwendet werden kann.

Es funktioniert bereits, erstellt die Postleitzahlen mit PHP und verwendet Gzdeflate (), um die komprimierten Daten zu generieren.

Das Problem ist, dass Gzdeflate () die gesamte Datei in den Speicher laden muss, und ich möchte, dass die Klasse auf 32 MB Speicher beschränkt ist. Derzeit speichert es Dateien, die größer als 16 MB ohne Komprimierung sind.

Ich kann mir vorstellen, dass ich Daten in Blöcken (16 MB x 16 MB) komprimieren sollte, aber ich weiß nicht, wie ich das Ergebnis von zwei Gzdeflate verkettet ().

Ich habe es getestet und es scheint, als ob es in den letzten 16 Bits etwas Mathe erfordert, irgendwie buff->last16bits = (buff->last16bits & newblock->first16bits) | 0xfffe, es funktioniert, aber nicht für alle Proben ...

Frage: Wie kann man zwei entleerte Streams verkettet, ohne ihn zu dekomprimieren?

War es hilfreich?

Lösung

PHP -Stream -Filter werden verwendet, um solche Aufgaben auszuführen. stream_filter_append kann beim Lesen oder Schreiben in Streams verwendet werden. Zum Beispiel

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

Jetzt fread Wir können Sie entleerte Daten zurückgeben.

Andere Tipps

Dies kann helfen oder nicht. Es sieht so aus, als ob GZWRITE es Ihnen ermöglicht, Dateien zu schreiben, ohne dass sie vollständig im Speicher geladen werden. Dieses Beispiel auf der PHP -Handbuchseite zeigt, wie Sie eine Datei mit GZWRITE und FOPEN komprimieren können.

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top