Signatur
Beschreibung
InflateContext ist eine interne, vollständig opake PHP-Klasse, die einen laufenden Dekomprimierungskontext für zlib-komprimierte Daten (DEFLATE/zlib/gzip) repräsentiert. Instanzen dieser Klasse werden ausschließlich von der Funktion inflate_init() erzeugt und anschließend an inflate_add() sowie inflate_get_status() und inflate_get_read_len() übergeben.
Vor PHP 8.0.0 lieferte inflate_init() eine klassische PHP-Ressource vom Typ zlib.inflate zurück. Mit der Migration zu Objekten wird Typsicherheit gewährleistet: Funktionen, die einen InflateContext erwarten, können dies per Typdeklaration erzwingen, und instanceof-Prüfungen sind möglich.
Da die Klasse vollständig opak ist, hat sie keine öffentlichen Eigenschaften oder Methoden, die direkt aufgerufen werden könnten. Sie dient ausschließlich als Handle für den internen C-seitigen Dekomprimierungszustand und sollte nur in Kombination mit den zugehörigen inflate_*()-Funktionen verwendet werden.
Typische Einsatzgebiete sind das schrittweise (inkrementelle) Dekomprimieren großer Datenströme, z. B. beim Empfang komprimierter HTTP-Antworten oder beim Verarbeiten von gzip-komprimierten Dateiströmen, ohne den gesamten Datenstrom zunächst im Speicher zu puffern.
Beispiele
Inkrementelles Dekomprimieren eines zlib-Datenstroms
<?php
// Beispiel-Daten: einen String komprimieren und anschließend schrittweise dekomprimieren
$originalText = str_repeat('Hello, World! ', 100);
$compressed = zlib_encode($originalText, ZLIB_ENCODING_DEFLATE);
// InflateContext erzeugen
$context = inflate_init(ZLIB_ENCODING_DEFLATE);
if (!($context instanceof InflateContext)) {
throw new RuntimeException('Kein gültiger InflateContext erhalten.');
}
// Daten in Blöcken verarbeiten (hier simuliert mit je 50 Bytes)
$decompressed = '';
$chunkSize = 50;
$offset = 0;
while ($offset < strlen($compressed)) {
$chunk = substr($compressed, $offset, $chunkSize);
$decompressed .= inflate_add($context, $chunk, ZLIB_SYNC_FLUSH);
$offset += $chunkSize;
}
// Abschließenden Block verarbeiten
$decompressed .= inflate_add($context, '', ZLIB_FINISH);
echo ($decompressed === $originalText) ? 'Dekomprimierung erfolgreich!' : 'Fehler!';
echo PHP_EOL;
echo 'Gelesene Bytes (komprimiert): ' . inflate_get_read_len($context) . PHP_EOL;
Typdeklaration mit InflateContext in eigener Funktion
<?php
function decompressChunk(InflateContext $ctx, string $data): string
{
$result = inflate_add($ctx, $data, ZLIB_SYNC_FLUSH);
if ($result === false) {
throw new RuntimeException('Dekomprimierungsfehler.');
}
return $result;
}
$compressed = zlib_encode('PHP 8 macht Spaß!', ZLIB_ENCODING_GZIP);
$ctx = inflate_init(ZLIB_ENCODING_GZIP);
$output = decompressChunk($ctx, $compressed);
$output .= inflate_add($ctx, '', ZLIB_FINISH);
echo $output;
// Wichtig · Fallstricke
Opakes Objekt: InflateContext kann nicht manuell instanziiert werden (new InflateContext() ist nicht möglich). Instanzen entstehen ausschließlich über inflate_init().
Kompatibilität: Code, der vor PHP 8.0 eine Ressource (resource) als Rückgabetyp von inflate_init() erwartet hat, muss auf InflateContext umgestellt werden. Ein is_resource()-Check schlägt ab PHP 8.0 fehl.
Speicherverwaltung: Der interne Dekomprimierungszustand wird automatisch freigegeben, sobald das InflateContext-Objekt vom Garbage Collector erfasst wird. Ein explizites Schließen wie bei alten Ressourcen ist nicht erforderlich.