Signatur
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
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;
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;
// 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.