Start · Sprachen · PHP · Referenz · InflateContext

InflateContext

Klasse

Vollständig opake Klasse, die ab PHP 8.0.0 die bisherigen <code>zlib.inflate</code>-Ressourcen als typsichere Objekte ersetzt.

seit PHP 8.0.0 Kategorie: io

Signatur

class InflateContext

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;
Dekomprimierung erfolgreich! Gelesene Bytes (komprimiert): 46

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;
PHP 8 macht Spaß!

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