Signatur
Beschreibung
zlib_encode() komprimiert den übergebenen String $data mithilfe der zlib-Bibliothek. Über den Parameter $encoding kann zwischen drei Formaten gewählt werden: raw DEFLATE (ZLIB_ENCODING_RAW), dem ZLIB/DEFLATE-Format mit zlib-Header (ZLIB_ENCODING_DEFLATE) und dem GZIP-Format (ZLIB_ENCODING_GZIP).
Die Funktion ist eine einheitliche Alternative zu den älteren Einzelfunktionen gzdeflate(), gzcompress() und gzencode(), die dieselben Formate, aber unterschiedliche Signaturen verwenden. Mit zlib_encode() lässt sich das Format zur Laufzeit flexibel wählen, was insbesondere bei konfigurierbaren HTTP-Komprimierungsresponsen nützlich ist.
Der Komprimierungsgrad kann über $level von 0 (keine Komprimierung) bis 9 (maximale Komprimierung) eingestellt werden. Der Standardwert -1 entspricht dem zlib-Standardgrad, der in der Regel einen guten Kompromiss zwischen Geschwindigkeit und Komprimierungsrate bietet.
Zum Dekomprimieren der erzeugten Daten dient zlib_decode(), das das Format automatisch erkennt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $data Pflicht | string | Der zu komprimierende Eingabe-String. | |
| $encoding Pflicht | int | Das Komprimierungsformat. Erlaubte Konstanten: ZLIB_ENCODING_RAW (raw DEFLATE), ZLIB_ENCODING_DEFLATE (ZLIB-Format mit Header) oder ZLIB_ENCODING_GZIP (GZIP-Format). |
|
| $level | int | -1 | Komprimierungsgrad von 0 (keine Komprimierung) bis 9 (maximale Komprimierung). -1 verwendet den zlib-Standardwert. |
Rückgabewert
$encoding oder interner zlib-Fehler) wird false zurückgegeben.Beispiele
GZIP-Komprimierung für HTTP-Response
<?php
$daten = str_repeat('Dies ist ein langer Testtext für die Komprimierung. ', 100);
$komprimiert = zlib_encode($daten, ZLIB_ENCODING_GZIP);
if ($komprimiert === false) {
die('Komprimierung fehlgeschlagen.');
}
echo 'Original: ' . strlen($daten) . ' Bytes' . PHP_EOL;
echo 'Komprimiert: ' . strlen($komprimiert) . ' Bytes' . PHP_EOL;
echo 'Einsparung: ' . round((1 - strlen($komprimiert) / strlen($daten)) * 100, 1) . '%' . PHP_EOL;
// Dekomprimieren mit zlib_decode
$original = zlib_decode($komprimiert);
echo 'Wiederhergestellt: ' . ($original === $daten ? 'OK' : 'FEHLER') . PHP_EOL;
Dynamische Formatauswahl anhand des Accept-Encoding-Headers
<?php
function komprimiereAntwort(string $body): array {
$acceptEncoding = $_SERVER['HTTP_ACCEPT_ENCODING'] ?? '';
if (str_contains($acceptEncoding, 'gzip')) {
$encoding = ZLIB_ENCODING_GZIP;
$headerWert = 'gzip';
} elseif (str_contains($acceptEncoding, 'deflate')) {
$encoding = ZLIB_ENCODING_DEFLATE;
$headerWert = 'deflate';
} else {
return ['body' => $body, 'header' => null];
}
$komprimiert = zlib_encode($body, $encoding, 6);
if ($komprimiert === false) {
return ['body' => $body, 'header' => null];
}
return ['body' => $komprimiert, 'header' => $headerWert];
}
$body = '<html><body>Hallo Welt!</body></html>';
$result = komprimiereAntwort($body);
if ($result['header'] !== null) {
header('Content-Encoding: ' . $result['header']);
}
header('Content-Length: ' . strlen($result['body']));
echo $result['body'];
// Wichtig · Fallstricke
Konstanten vs. Integer: Die Konstanten ZLIB_ENCODING_RAW (-15), ZLIB_ENCODING_DEFLATE (15) und ZLIB_ENCODING_GZIP (31) sind erst ab PHP 5.4 definiert. Bei der Übergabe von Rohwerten ist Vorsicht geboten, da ein falscher Wert zu false führt oder undefiniertes Verhalten auslöst.
Speicherverbrauch: Die Funktion verarbeitet den gesamten String im Arbeitsspeicher. Für sehr große Datenmengen (z. B. Datei-Streams) sollte stattdessen DeflateContext mit deflate_init() / deflate_add() verwendet werden, um Daten blockweise zu komprimieren.
GZIP vs. DEFLATE im HTTP-Kontext: Auch wenn der HTTP-Header Content-Encoding: deflate heißt, erwarten viele Browser tatsächlich das ZLIB-Format (ZLIB_ENCODING_DEFLATE). Für maximale Kompatibilität ist ZLIB_ENCODING_GZIP vorzuziehen.