Start · Sprachen · PHP · Referenz · gzcompress

gzcompress

Funktion

Komprimiert einen String mit dem ZLIB-Algorithmus (deflate) und gibt die komprimierten Daten zurück.

seit PHP 4.0.1 Kategorie: io

Signatur

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

Beschreibung

gzcompress() komprimiert einen String mithilfe des DEFLATE-Algorithmus der ZLIB-Bibliothek. Die Funktion erzeugt dabei einen komprimierten Byte-String, der einen ZLIB-Header und eine Prüfsumme enthält – das Format entspricht dem RFC 1950 (ZLIB-Format), nicht dem gzip-Format (RFC 1952).

Typische Einsatzgebiete sind die Reduzierung von Datenmengen vor dem Speichern in Datenbanken oder Dateien, die Komprimierung von HTTP-Antworten sowie die Verkleinerung von Daten vor der Übertragung über ein Netzwerk. Die komprimierten Daten können mit gzuncompress() wieder entpackt werden.

Der Komprimierungsgrad $level kann zwischen 0 (keine Komprimierung) und 9 (maximale Komprimierung) liegen. Der Standardwert -1 verwendet den Standard-Komprimierungsgrad der ZLIB-Bibliothek (derzeit äquivalent zu Level 6), der einen guten Kompromiss zwischen Geschwindigkeit und Komprimierungsrate bietet.

Zu beachten ist, dass gzcompress() ein anderes Format erzeugt als gzencode() (gzip-Format) oder gzdeflate() (rohes DEFLATE ohne Header). Die Funktionen sind daher nicht austauschbar – die komprimierten Daten müssen mit der jeweils passenden Dekomprimierungsfunktion entpackt werden.

Parameter

Name Typ Default Beschreibung
$data Pflicht string Der zu komprimierende String.
$level int -1 Der Komprimierungsgrad: 0 = keine Komprimierung, 1 = schnellste Komprimierung, 9 = maximale Komprimierung, -1 = Standard der ZLIB-Bibliothek (empfohlen).
$encoding int ZLIB_ENCODING_DEFLATE Der Kodierungsmodus. Mögliche Werte: ZLIB_ENCODING_RAW, ZLIB_ENCODING_DEFLATE oder ZLIB_ENCODING_GZIP. Seit PHP 7.0.0 verfügbar.

Rückgabewert

Typ
string|false
Beschreibung
Gibt bei Erfolg den komprimierten String zurück. Bei einem Fehler (z. B. ungültiger Komprimierungsgrad) wird false zurückgegeben.

Beispiele

Einfache Komprimierung und Dekomprimierung

<?php
$originalData = 'Dies ist ein Teststring, der komprimiert werden soll. Je länger und repetitiver der Text, desto besser die Komprimierungsrate.';

$compressed = gzcompress($originalData);
$decompressed = gzuncompress($compressed);

echo 'Originalgröße:     ' . strlen($originalData) . ' Bytes' . PHP_EOL;
echo 'Komprimiert:       ' . strlen($compressed) . ' Bytes' . PHP_EOL;
echo 'Dekomprimiert:     ' . $decompressed . PHP_EOL;
echo 'Identisch:         ' . ($originalData === $decompressed ? 'Ja' : 'Nein') . PHP_EOL;
Originalgröße: 128 Bytes Komprimiert: 105 Bytes Dekomprimiert: Dies ist ein Teststring, der komprimiert werden soll. Je länger und repetitiver der Text, desto besser die Komprimierungsrate. Identisch: Ja

Komprimierte Daten in einer MySQL-Datenbank speichern

<?php
// Verbindung zu MySQL herstellen (PDO)
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');

$largeContent = str_repeat('Beispielinhalt für die Datenbank. ', 500);

// Komprimieren vor dem Speichern (Level 6)
$compressed = gzcompress($largeContent, 6);

$stmt = $pdo->prepare('INSERT INTO documents (content_compressed) VALUES (:content)');
$stmt->execute([':content' => $compressed]);

echo 'Gespeichert. Originalgröße: ' . strlen($largeContent) . ' Bytes, '
   . 'Komprimierte Größe: ' . strlen($compressed) . ' Bytes' . PHP_EOL;

// Beim Lesen wieder dekomprimieren
$stmt = $pdo->query('SELECT content_compressed FROM documents ORDER BY id DESC LIMIT 1');
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$restored = gzuncompress($row['content_compressed']);

echo 'Wiederhergestellt: ' . strlen($restored) . ' Bytes' . PHP_EOL;
Gespeichert. Originalgröße: 17500 Bytes, Komprimierte Größe: 97 Bytes Wiederhergestellt: 17500 Bytes

Vergleich der Komprimierungsgrade

<?php
$data = str_repeat('PHP ist eine weit verbreitete serverseitige Skriptsprache. ', 100);

foreach ([0, 1, 5, 9] as $level) {
    $compressed = gzcompress($data, $level);
    printf('Level %d: %5d Bytes (%.1f%% des Originals)%s',
        $level,
        strlen($compressed),
        strlen($compressed) / strlen($data) * 100,
        PHP_EOL
    );
}
Level 0: 5820 Bytes (97.0% des Originals) Level 1: 186 Bytes ( 3.1% des Originals) Level 5: 149 Bytes ( 2.5% des Originals) Level 9: 143 Bytes ( 2.4% des Originals)

// Wichtig · Fallstricke

Format-Kompatibilität: gzcompress() erzeugt das ZLIB-Format (RFC 1950) mit Header und Adler-32-Prüfsumme. Dieses Format ist nicht kompatibel mit gzip-Dateien (gzencode()) oder rohen DEFLATE-Daten (gzdeflate()). Verwende immer die passende Gegenfunktion: gzuncompress().

Binärdaten: Da komprimierte Daten Binärdaten enthalten, sollten sie vor dem Speichern in Textfeldern (z. B. VARCHAR) oder bei der Übertragung als Text mit base64_encode() kodiert werden. Für Datenbankfelder empfiehlt sich der Datentyp BLOB.

Speicherlimit: Bei sehr großen Strings kann die Komprimierung einen erheblichen Speicherbedarf verursachen. Für das Komprimieren großer Dateien ist die Verwendung von gzopen(), gzwrite() und gzclose() effizienter, da diese streambasiert arbeiten.

Voraussetzung: Die Funktion setzt voraus, dass PHP mit ZLIB-Unterstützung kompiliert wurde (PHP-Extension zlib). Diese ist in den meisten Standard-Installationen bereits aktiviert.