Start · Sprachen · PHP · Referenz · inflate_add

inflate_add

Funktion

Fügt Daten inkrementell zu einem laufenden Inflate-Prozess hinzu und dekomprimiert sie schrittweise.

seit PHP 7.0.0 Kategorie: io

Signatur

inflate_add(DeflateContext $context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string|false

Beschreibung

inflate_add() dekomprimiert einen Datenblock schrittweise, ohne dass der gesamte komprimierte Datenstrom im Voraus bekannt sein muss. Dies ist besonders nützlich bei der Verarbeitung großer Datenströme (z. B. HTTP-Chunked-Encoding mit gzip-Komprimierung) oder wenn Daten stückweise empfangen werden, wie bei Netzwerk-Streams.

Die Funktion arbeitet auf einem DeflateContext-Objekt, das zuvor mit inflate_init() erstellt werden muss. Der Kontext speichert den internen Zustand des Dekompressors zwischen den einzelnen Aufrufen, sodass mehrere aufeinanderfolgende Datenblöcke korrekt verarbeitet werden können.

Über den Parameter flush_mode kann gesteuert werden, wann der interne Puffer ausgegeben wird. Die gängigen Modi sind ZLIB_SYNC_FLUSH (gibt alle verfügbaren dekomprimierten Daten sofort aus), ZLIB_NO_FLUSH (puffert Daten intern) und ZLIB_FINISH (signalisiert das Ende des Datenstroms).

Diese Funktion ist die Gegenstücke zu deflate_add() und ergänzt die klassischen Funktionen gzinflate() und gzuncompress() um die Fähigkeit zur inkrementellen, streambasierten Verarbeitung.

Parameter

Name Typ Default Beschreibung
$context Pflicht DeflateContext Ein Inflate-Kontext-Objekt, das zuvor mit inflate_init() erstellt wurde. Er speichert den Zustand des Dekompressors zwischen den Aufrufen.
$data Pflicht string Der zu dekomprimierende Datenblock. Kann ein beliebig großes Stück des komprimierten Datenstroms sein.
$flush_mode int ZLIB_SYNC_FLUSH Steuert das Flush-Verhalten. Mögliche Werte: ZLIB_BLOCK, ZLIB_NO_FLUSH, ZLIB_PARTIAL_FLUSH, ZLIB_SYNC_FLUSH (Standard), ZLIB_FULL_FLUSH oder ZLIB_FINISH. ZLIB_FINISH muss beim letzten Datenblock verwendet werden.

Rückgabewert

Typ
string|false
Beschreibung
Gibt einen String mit den dekomprimierten Daten zurück. Der String kann leer sein, wenn noch nicht genügend Daten für eine Ausgabe vorliegen (bei ZLIB_NO_FLUSH). Bei einem Fehler wird false zurückgegeben.

Beispiele

Einfache inkrementelle Dekomprimierung eines gzip-Strings

<?php
// Zunächst einen komprimierten Datenstrom erzeugen
$original = 'Dies ist ein Teststring, der komprimiert und dann inkrementell dekomprimiert wird.';
$compressed = gzencode($original);

// Inflate-Kontext für gzip-Format erstellen
$context = inflate_init(ZLIB_ENCODING_GZIP);

// Daten in zwei Hälften aufteilen und inkrementell dekomprimieren
$half = (int)(strlen($compressed) / 2);
$chunk1 = substr($compressed, 0, $half);
$chunk2 = substr($compressed, $half);

$output = '';
$output .= inflate_add($context, $chunk1, ZLIB_NO_FLUSH);
$output .= inflate_add($context, $chunk2, ZLIB_FINISH);

echo $output;
Dies ist ein Teststring, der komprimiert und dann inkrementell dekomprimiert wird.

Stream-Dekomprimierung von HTTP-Chunk-Daten

<?php
// Simulierte komprimierte Datenpakete (z. B. aus einem Netzwerk-Stream)
$data = 'Hallo Welt! Dies ist ein längerer Text für die Stream-Demonstration.';
$chunks = str_split(gzdeflate($data), 8); // In 8-Byte-Blöcke aufteilen

$context = inflate_init(ZLIB_ENCODING_RAW);
$result = '';

$total = count($chunks);
foreach ($chunks as $i => $chunk) {
    $flushMode = ($i === $total - 1) ? ZLIB_FINISH : ZLIB_SYNC_FLUSH;
    $decoded = inflate_add($context, $chunk, $flushMode);
    if ($decoded === false) {
        echo 'Fehler bei der Dekomprimierung!';
        break;
    }
    $result .= $decoded;
}

echo $result;
Hallo Welt! Dies ist ein längerer Text für die Stream-Demonstration.

// Wichtig · Fallstricke

Wichtig: Der flush_mode ZLIB_FINISH muss beim letzten Aufruf gesetzt werden, um den Dekompressor korrekt abzuschließen. Wird er vergessen, können Daten verloren gehen oder der interne Zustand des Kontexts korrumpiert werden.

Nach einem Aufruf mit ZLIB_FINISH sollte der Kontext nicht wiederverwendet werden. Für weitere Dekomprimierungen ist ein neuer Kontext mit inflate_init() zu erstellen.

Die Funktion erfordert die zlib-Erweiterung, die standardmäßig in den meisten PHP-Installationen aktiviert ist. Das verwendete Encoding (ZLIB_ENCODING_GZIP, ZLIB_ENCODING_DEFLATE oder ZLIB_ENCODING_RAW) muss dem Format der Eingabedaten entsprechen, sonst schlägt die Dekomprimierung fehl.