Signatur
Beschreibung
deflate_init() erstellt einen wiederverwendbaren Komprimierungskontext, der für die inkrementelle (schrittweise) Komprimierung von Daten mit dem DEFLATE-Algorithmus genutzt wird. Im Gegensatz zu gzencode() oder zlib_encode() erlaubt diese Funktion, Daten in mehreren Häppchen zu komprimieren, ohne den gesamten Datenstrom vorab im Speicher halten zu müssen.
Der zurückgegebene DeflateContext wird anschließend mit deflate_add() befüttert, um Datenchunks sukzessive zu komprimieren. Dies ist besonders nützlich beim Streamen großer Dateien oder beim Komprimieren von HTTP-Antworten in Echtzeit, da der Arbeitsspeicherbedarf drastisch reduziert wird.
Über den $encoding-Parameter wird das Ausgabeformat festgelegt: ZLIB_ENCODING_RAW erzeugt einen rohen DEFLATE-Stream, ZLIB_ENCODING_DEFLATE einen zlib-gekapselten Stream und ZLIB_ENCODING_GZIP einen gzip-kompatiblen Stream. Mit dem $options-Array lassen sich Kompressionslevel, Fenstergröße, Speicherlevel und Strategie feinjustieren.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $encoding Pflicht | int | Das gewünschte Ausgabeformat. Erlaubte Werte sind: ZLIB_ENCODING_RAW (roher DEFLATE-Stream), ZLIB_ENCODING_DEFLATE (zlib-Format mit Header/Trailer) oder ZLIB_ENCODING_GZIP (gzip-Format). |
|
| $options | array | [] | Optionales Konfigurations-Array mit folgenden Schlüsseln:
|
Rückgabewert
DeflateContext-Objekt zurück, das für nachfolgende deflate_add()-Aufrufe benötigt wird. Im Fehlerfall (z. B. ungültige Parameter) wird false zurückgegeben.Beispiele
Einfache inkrementelle Komprimierung eines Strings
<?php
// Kontext für gzip-Format mit Kompressionslevel 6 erstellen
$context = deflate_init(ZLIB_ENCODING_GZIP, ['level' => 6]);
if ($context === false) {
die('Kontext konnte nicht erstellt werden.');
}
$data = 'Hallo, das ist ein Teststring der komprimiert werden soll. ';
$compressed = '';
// Ersten Chunk hinzufügen (noch kein Flush)
$compressed .= deflate_add($context, $data, ZLIB_NO_FLUSH);
// Zweiten Chunk hinzufügen und Stream finalisieren
$compressed .= deflate_add($context, $data, ZLIB_FINISH);
echo 'Originalgröße: ' . (strlen($data) * 2) . ' Bytes' . PHP_EOL;
echo 'Komprimiert: ' . strlen($compressed) . ' Bytes' . PHP_EOL;
echo 'Dekomprimiert: ' . gzdecode($compressed) . PHP_EOL;
Streaming-Komprimierung einer großen Datei in Chunks
<?php
// GZIP-Komprimierung im Streaming-Modus
$context = deflate_init(ZLIB_ENCODING_GZIP, ['level' => 5]);
if ($context === false) {
throw new RuntimeException('Deflate-Kontext konnte nicht initialisiert werden.');
}
$inputFile = '/tmp/grosse_datei.txt';
$outputFile = '/tmp/grosse_datei.txt.gz';
$in = fopen($inputFile, 'rb');
$out = fopen($outputFile, 'wb');
if (!$in || !$out) {
throw new RuntimeException('Dateien konnten nicht geöffnet werden.');
}
$chunkSize = 65536; // 64 KB pro Chunk
while (!feof($in)) {
$chunk = fread($in, $chunkSize);
$flush = feof($in) ? ZLIB_FINISH : ZLIB_NO_FLUSH;
fwrite($out, deflate_add($context, $chunk, $flush));
}
fclose($in);
fclose($out);
echo 'Datei erfolgreich komprimiert.' . PHP_EOL;
// Wichtig · Fallstricke
Ressourcenverwaltung: Ab PHP 8.0 gibt deflate_init() ein DeflateContext-Objekt zurück; in PHP 7.x war es noch eine Ressource vom Typ zlib.deflate. Code, der auf den Typ der Rückgabe prüft, muss ggf. angepasst werden.
Finalisierung nicht vergessen: Der komprimierte Stream ist erst vollständig, wenn deflate_add() mit dem Flag ZLIB_FINISH aufgerufen wird. Fehlt dieser abschließende Aufruf, ist der erzeugte Stream unvollständig und kann nicht korrekt dekomprimiert werden.
Speichereffizienz: Für sehr kleine Datenmengen ist die direkte Nutzung von gzencode() oder zlib_encode() einfacher. Die inkrementelle API lohnt sich vor allem bei großen Datenströmen oder wenn die Daten stückweise ankommen (z. B. beim Proxying von HTTP-Inhalten).