Signatur
Beschreibung
gzinflate() dekomprimiert eine Zeichenkette, die mit dem rohen DEFLATE-Algorithmus komprimiert wurde. Die Funktion ist das Gegenstück zu gzdeflate() und arbeitet mit dem rohen DEFLATE-Format — also ohne den gzip-Header, wie er bei gzdecode() oder gzuncompress() erwartet wird.
Typische Einsatzgebiete sind die Dekomprimierung von HTTP-Antworten, die mit Content-Encoding: deflate übertragen wurden, sowie die Verarbeitung von binären Daten, die z. B. aus Datenbanken oder Dateien stammen und zuvor mit gzdeflate() komprimiert wurden.
Mit dem optionalen Parameter max_length lässt sich die maximale Größe der dekodierten Ausgabe begrenzen. Das kann sinnvoll sein, um sogenannte Zip-Bomb-Angriffe zu entschärfen, bei denen winzige komprimierte Eingaben zu riesigen Ausgaben führen. Wird der Grenzwert überschritten, gibt die Funktion false zurück.
Im Gegensatz zu gzuncompress() (zlib-Format mit Header/Prüfsumme) und gzdecode() (gzip-Format) erwartet gzinflate() ausschließlich rohe DEFLATE-komprimierte Daten ohne Wrapper. Bei falschen Eingabedaten oder beschädigten Streams wird ebenfalls false zurückgegeben.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $data Pflicht | string | Die mit DEFLATE (roh, ohne Header) komprimierte Zeichenkette, die dekomprimiert werden soll. | |
| $max_length | int | 0 | Maximale Länge der dekomprimierten Ausgabe in Bytes. 0 bedeutet keine Begrenzung. Wird der Wert überschritten, gibt die Funktion false zurück. |
Rückgabewert
max_length — wird false zurückgegeben.Beispiele
Einfaches Komprimieren und Dekomprimieren mit gzdeflate/gzinflate
<?php
$original = 'Das ist ein Testtext, der komprimiert und wieder dekomprimiert wird.';
// Komprimieren mit gzdeflate (roh, DEFLATE)
$compressed = gzdeflate($original, 9);
echo 'Komprimiert: ' . strlen($compressed) . ' Bytes' . PHP_EOL;
// Dekomprimieren mit gzinflate
$decompressed = gzinflate($compressed);
if ($decompressed === false) {
echo 'Fehler beim Dekomprimieren!' . PHP_EOL;
} else {
echo 'Dekomprimiert: ' . $decompressed . PHP_EOL;
echo 'Identisch: ' . ($decompressed === $original ? 'Ja' : 'Nein') . PHP_EOL;
}
Schutz vor Zip-Bombs mit max_length
<?php
// Sehr repetitiven Text komprimieren (hohe Kompressionrate)
$bigText = str_repeat('AAAA', 100000); // 400 000 Bytes
$compressed = gzdeflate($bigText, 9);
echo 'Komprimiert: ' . strlen($compressed) . ' Bytes' . PHP_EOL;
// Maximale dekomprimierte Größe auf 1000 Bytes begrenzen
$result = gzinflate($compressed, 1000);
if ($result === false) {
echo 'Dekomprimierung abgebrochen: Ausgabe würde Limit überschreiten.' . PHP_EOL;
} else {
echo 'Dekomprimiert: ' . strlen($result) . ' Bytes' . PHP_EOL;
}
Dekomprimierung einer HTTP-Antwort mit deflate-Encoding
<?php
// Simuliert eine HTTP-Antwort mit Content-Encoding: deflate
// Viele Webserver senden tatsächlich raw DEFLATE (ohne zlib-Wrapper)
$responseBody = gzdeflate('{ "status": "ok", "value": 42 }');
$decoded = gzinflate($responseBody);
if ($decoded !== false) {
$data = json_decode($decoded, true);
echo 'Status: ' . $data['status'] . PHP_EOL;
echo 'Wert: ' . $data['value'] . PHP_EOL;
} else {
echo 'Dekomprimierung fehlgeschlagen.' . PHP_EOL;
}
// Wichtig · Fallstricke
Formatunterschiede beachten: gzinflate() erwartet ausschließlich rohe DEFLATE-Daten. Daten im zlib-Format (mit 2-Byte-Header und Adler-32-Prüfsumme) müssen mit gzuncompress() dekomprimiert werden, Daten im gzip-Format mit gzdecode(). Die Funktionen sind nicht untereinander austauschbar.
Sicherheitshinweis (Zip-Bomb): Unkontrollierte Dekomprimierung von Benutzereingaben kann zu massivem Speicherverbrauch führen. Es empfiehlt sich, den Parameter max_length stets auf einen sinnvollen Maximalwert zu setzen, wenn die Eingabequelle nicht vertrauenswürdig ist.
Fehlerbehandlung: Der Rückgabewert false sollte mit === false geprüft werden, da ein leerer String '' ein gültiges Dekomprimierungsergebnis sein kann.