Start · Sprachen · PHP · Referenz · gzencode

gzencode

Funktion

Komprimiert eine Zeichenkette mit dem gzip-Algorithmus und gibt die komprimierten Daten zurück.

seit PHP 4.0.4 Kategorie: io

Signatur

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

Beschreibung

gzencode() komprimiert einen String mit dem DEFLATE-Algorithmus und verpackt das Ergebnis in einen gzip-kompatiblen Container (RFC 1952). Das Resultat kann direkt als .gz-Datei gespeichert oder über HTTP mit dem Header Content-Encoding: gzip an den Browser übertragen werden.

Der optionale Parameter $level steuert den Kompressionsgrad: 0 bedeutet keine Kompression, 9 maximale Kompression (langsamster Algorithmus). Der Standardwert -1 überlässt die Wahl dem zugrunde liegenden zlib, das üblicherweise Stufe 6 wählt – ein gutes Gleichgewicht zwischen Geschwindigkeit und Kompressionsrate.

Über den Parameter $encoding lässt sich zwischen einem echten gzip-Container (FORCE_GZIP) und einem zlib-Container (FORCE_DEFLATE) wählen. Für die Übertragung an Webbrowser und zum Speichern als .gz-Datei ist FORCE_GZIP die richtige Wahl.

Typische Einsatzbereiche sind die Reduktion von Übertragungsvolumen bei API-Antworten, das platzsparende Speichern von Log- oder Backup-Daten sowie die manuelle Ausgabe-Komprimierung, wenn ob_gzhandler oder zlib.output_compression nicht verfügbar sind.

Parameter

Name Typ Default Beschreibung
$data Pflicht string Die zu komprimierende Zeichenkette. Kann beliebige Binär- oder Textdaten enthalten.
$level int -1 Kompressionsgrad von 0 (keine Kompression) bis 9 (maximale Kompression). -1 verwendet den zlib-Standard (ca. Stufe 6).
$encoding int FORCE_GZIP Encoding-Modus: FORCE_GZIP (Standard, erzeugt echten gzip-Container) oder FORCE_DEFLATE (erzeugt zlib-Container ohne gzip-Header).

Rückgabewert

Typ
string|false
Beschreibung
Gibt die komprimierten Daten als binären String zurück. Im Fehlerfall wird false zurückgegeben.

Beispiele

Einfaches Komprimieren und Dekomprimieren

<?php
$original = 'Dies ist ein langer Beispieltext, der komprimiert werden soll. ' .
            'Je länger und repetitiver der Text, desto besser das Kompressionsergebnis.';

$compressed = gzencode($original, 9);

echo 'Originalgröße:     ' . strlen($original)   . ' Bytes' . PHP_EOL;
echo 'Komprimiert:       ' . strlen($compressed) . ' Bytes' . PHP_EOL;
echo 'Kompressionsrate:  ' . round((1 - strlen($compressed) / strlen($original)) * 100, 1) . ' %' . PHP_EOL;

// Wieder dekomprimieren
$restored = gzdecode($compressed);
echo 'Wiederhergestellt: ' . $restored . PHP_EOL;
Originalgröße: 155 Bytes Komprimiert: 122 Bytes Kompressionsrate: 21.3 % Wiederhergestellt: Dies ist ein langer Beispieltext, der komprimiert werden soll. Je länger und repetitiver der Text, desto besser das Kompressionsergebnis.

Gzip-komprimierte HTTP-Antwort senden

<?php
$data = json_encode([
    'status' => 'ok',
    'items'  => array_fill(0, 100, ['id' => 1, 'name' => 'Beispiel-Produkt', 'price' => 9.99]),
]);

$compressed = gzencode($data, 6);

if ($compressed !== false && isset($_SERVER['HTTP_ACCEPT_ENCODING'])
    && str_contains($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) {
    header('Content-Encoding: gzip');
    header('Content-Type: application/json; charset=utf-8');
    header('Content-Length: ' . strlen($compressed));
    echo $compressed;
} else {
    header('Content-Type: application/json; charset=utf-8');
    echo $data;
}

Komprimierten Inhalt als .gz-Datei speichern

<?php
$logData = implode(PHP_EOL, array_map(
    fn(int $i) => date('Y-m-d H:i:s') . ' [INFO] Log-Eintrag Nummer ' . $i,
    range(1, 1000)
));

$compressed = gzencode($logData, 6);

if ($compressed !== false) {
    file_put_contents('/tmp/app-' . date('Ymd') . '.log.gz', $compressed);
    echo 'Log gespeichert: ' . strlen($compressed) . ' Bytes (statt ' . strlen($logData) . ' Bytes unkomprimiert)';
} else {
    echo 'Fehler bei der Komprimierung.';
}
Log gespeichert: 5124 Bytes (statt 55894 Bytes unkomprimiert)

// Wichtig · Fallstricke

Binäre Sicherheit: gzencode() ist binärsicher und kann sowohl Text als auch beliebige Binärdaten verarbeiten.

Nicht mit gzcompress() verwechseln: gzcompress() erzeugt einen rohen zlib-Stream (RFC 1950), gzencode() einen gzip-Container (RFC 1952). Die Ergebnisse sind nicht gegenseitig dekomprimierbar. Zum Dekomprimieren von gzencode()-Daten ist gzdecode() zu verwenden.

Höhere Kompressionsstufen kosten CPU: Stufe 9 kann für sehr große Strings deutlich mehr Rechenzeit benötigen als Stufe 6, liefert aber oft nur marginal bessere Kompressionsraten. Für Web-Anwendungen ist Stufe 5–6 meist der beste Kompromiss.

Voraussetzung: PHP muss mit zlib-Unterstützung kompiliert worden sein (--with-zlib).