Start · Sprachen · PHP · Referenz · deflate_init

deflate_init

Funktion

Initialisiert einen inkrementellen Deflate-Komprimierungskontext für die schrittweise Komprimierung von Datenströmen.

seit PHP 7.0.0 Kategorie: io

Signatur

deflate_init(int $encoding, array $options = []): DeflateContext|false

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:
  • level (int, -1 bis 9): Kompressionsstufe; -1 = Standardwert der Bibliothek
  • memory (int, 1 bis 9): Speicherlevel für die Komprimierung
  • window (int, 8 bis 15): Logarithmische Fenstergröße
  • strategy (int): Kompressionsstrategie, z. B. ZLIB_DEFAULT_STRATEGY, ZLIB_FILTERED, ZLIB_HUFFMAN_ONLY
  • dictionary (string|array): Vordefiniertes Wörterbuch für die Komprimierung

Rückgabewert

Typ
DeflateContext|false
Beschreibung
Gibt bei Erfolg ein 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;
Originalgröße: 112 Bytes Komprimiert: 75 Bytes Dekomprimiert: Hallo, das ist ein Teststring der komprimiert werden soll. Hallo, das ist ein Teststring der komprimiert werden soll.

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;
Datei erfolgreich komprimiert.

// 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).