Start · Sprachen · PHP · Referenz · zlib_encode

zlib_encode

Funktion

Komprimiert einen String mit der angegebenen zlib-Kodierung (DEFLATE, GZIP oder ZLIB).

seit PHP 5.4.0 Kategorie: io

Signatur

zlib_encode(string $data, int $encoding, int $level = -1): string|false

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

Typ
string|false
Beschreibung
Gibt den komprimierten String zurück. Im Fehlerfall (z. B. ungültiges $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;
Original: 5200 Bytes Komprimiert: 76 Bytes Einsparung: 98.5% Wiederhergestellt: OK

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.