Signatur
Beschreibung
DeflateContext ist eine interne, vollständig opake Klasse in PHP, die den Zustand eines inkrementellen Deflate-Komprimierungsprozesses repräsentiert. Objekte dieser Klasse werden ausschließlich von der Funktion deflate_init() erstellt und können nicht direkt instanziiert werden. Sie dienen als Handle für alle nachfolgenden Aufrufe von deflate_add().
Vor PHP 8.0 wurde dieser Zustand durch eine Ressource vom Typ zlib.deflate dargestellt. Mit der allgemeinen Abkehr von Ressourcen hin zu echten Objekten wurde DeflateContext als typsicherer Ersatz eingeführt. Da die Klasse vollständig opak ist, können keine Eigenschaften gelesen oder Methoden direkt aufgerufen werden.
Der typische Anwendungsfall ist die Streaming-Komprimierung größerer Datenmengen, bei der Daten stückweise verarbeitet werden sollen, ohne alles auf einmal im Speicher halten zu müssen. Der Kontext speichert intern den Komprimierungszustand zwischen den einzelnen deflate_add()-Aufrufen.
Da es sich um eine opake Klasse handelt, ist sie lediglich als Typ-Deklaration in Funktionssignaturen relevant — etwa deflate_add(DeflateContext $context, ...). Eine direkte Vererbung oder Erweiterung ist nicht möglich.
Beispiele
Inkrementelle Komprimierung mit DeflateContext
<?php
// Kontext erstellen: Zlib-Format, Kompressionsstufe 6
$context = deflate_init(ZLIB_ENCODING_DEFLATE, ['level' => 6]);
if (!$context instanceof DeflateContext) {
throw new RuntimeException('Kontext konnte nicht erstellt werden.');
}
$chunks = [
'Hallo, das ist der erste Datenteil. ',
'Hier folgt der zweite Datenteil. ',
'Und hier der abschließende dritte Teil.',
];
$compressed = '';
foreach ($chunks as $index => $chunk) {
$isLast = ($index === array_key_last($chunks));
$flush = $isLast ? ZLIB_FINISH : ZLIB_SYNC_FLUSH;
$compressed .= deflate_add($context, $chunk, $flush);
}
echo 'Originalgröße: ' . strlen(implode('', $chunks)) . ' Bytes' . PHP_EOL;
echo 'Komprimiert: ' . strlen($compressed) . ' Bytes' . PHP_EOL;
// Dekomprimieren zur Verifikation
$decompressed = inflate_string($compressed, max_length: 1024);
echo 'Dekomprimiert: ' . $decompressed . PHP_EOL;
Typ-Prüfung auf DeflateContext
<?php
function komprimiereDaten(DeflateContext $ctx, string $daten, bool $abschliessen = false): string
{
$flush = $abschliessen ? ZLIB_FINISH : ZLIB_NO_FLUSH;
$result = deflate_add($ctx, $daten, $flush);
if ($result === false) {
throw new RuntimeException('Komprimierung fehlgeschlagen.');
}
return $result;
}
$ctx = deflate_init(ZLIB_ENCODING_GZIP, ['level' => 9]);
$teil1 = komprimiereDaten($ctx, 'Erste Hälfte der Nachricht. ');
$teil2 = komprimiereDaten($ctx, 'Zweite Hälfte der Nachricht.', true);
$gzipDaten = $teil1 . $teil2;
echo 'GZIP-Datengröße: ' . strlen($gzipDaten) . ' Bytes' . PHP_EOL;
echo 'Dekomprimiert: ' . gzdecode($gzipDaten) . PHP_EOL;
// Wichtig · Fallstricke
Opake Klasse: DeflateContext kann nicht mit new DeflateContext() instanziiert werden. Objekte dieser Klasse werden ausschließlich intern von deflate_init() erzeugt. Versuche, die Klasse zu erweitern oder direkt zu instanziieren, führen zu einem Fehler.
Migration von PHP 7.x: Code, der zuvor mit is_resource($ctx) und get_resource_type($ctx) === 'zlib.deflate' prüfte, sollte auf $ctx instanceof DeflateContext umgestellt werden, da is_resource() für Objekte false zurückgibt.
Flush-Modus beachten: Wird der letzte Chunk nicht mit ZLIB_FINISH abgeschlossen, ist der komprimierte Datenstrom unvollständig und kann nicht korrekt dekomprimiert werden. Zwischenzeitliche Flushes mit ZLIB_SYNC_FLUSH erhöhen die Datengröße leicht, ermöglichen aber Streaming-Szenarien.