Start · Sprachen · PHP · Referenz · gzwrite

gzwrite

Funktion

Schreibt eine Zeichenkette in eine geöffnete, gz-komprimierte Datei und gibt die Anzahl der geschriebenen (unkomprimierten) Bytes zurück.

seit PHP 4.0.0 Kategorie: io

Signatur

gzwrite(resource $stream, string $data, ?int $length = null): int|false

Beschreibung

gzwrite() schreibt den Inhalt von $data in den mit gzopen() geöffneten Datei-Stream $stream. Die Daten werden dabei transparent mit zlib komprimiert und in die Zieldatei geschrieben. Die Funktion arbeitet analog zu fwrite(), jedoch ausschließlich für gz-komprimierte Streams.

Mit dem optionalen Parameter $length kann die Anzahl der zu schreibenden Bytes begrenzt werden. Wird er weggelassen (oder als null übergeben), wird die gesamte Zeichenkette geschrieben. Diese Möglichkeit der Längenangabe ist nützlich, wenn nur ein bestimmter Teilbereich eines größeren Strings geschrieben werden soll.

Typische Einsatzgebiete sind das Erstellen von Backup-Dateien, das Exportieren großer Datensätze als komprimierte Textdateien (z. B. CSV oder Log-Dumps) sowie das Verarbeiten von Daten in Streaming-Szenarien, bei denen der gesamte Inhalt nicht auf einmal im Speicher gehalten werden soll.

Im Fehlerfall gibt die Funktion false zurück. Der Rückgabewert sollte daher stets auf false geprüft werden, da ein Rückgabewert von 0 bedeutet, dass kein Byte geschrieben wurde, aber kein Fehler aufgetreten ist.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Ein mit gzopen() geöffneter gz-Datei-Stream im Schreibmodus ('w') oder Anhängemodus ('a').
$data Pflicht string Die zu schreibende Zeichenkette. Sie wird vor dem Speichern automatisch komprimiert.
$length ?int null Optionale maximale Anzahl von Bytes aus $data, die geschrieben werden sollen. Ist der Wert größer als die Länge von $data, wird nur strlen($data) geschrieben. Bei null wird die gesamte Zeichenkette geschrieben.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der geschriebenen (unkomprimierten) Bytes als int zurück. Im Fehlerfall wird false zurückgegeben.

Beispiele

Einfaches Schreiben in eine gz-komprimierte Datei

<?php
$gz = gzopen('ausgabe.gz', 'w9'); // Komprimierungsstufe 9
if ($gz === false) {
    die('Datei konnte nicht geöffnet werden.');
}

$text = "Zeile 1: Hallo Welt\nZeile 2: PHP gz-Komprimierung\n";
$geschrieben = gzwrite($gz, $text);

echo "Bytes geschrieben (unkomprimiert): " . $geschrieben . PHP_EOL;

gzclose($gz);
Bytes geschrieben (unkomprimiert): 43

Zeilenweises Schreiben einer CSV-Datei als gz-Archiv

<?php
$daten = [
    ['Name', 'Alter', 'Stadt'],
    ['Anna',  28,     'Berlin'],
    ['Bernd', 34,     'Hamburg'],
    ['Clara', 22,     'München'],
];

$gz = gzopen('export.csv.gz', 'w6');
if ($gz === false) {
    die('Fehler beim Öffnen der Datei.');
}

foreach ($daten as $zeile) {
    $csv = implode(';', $zeile) . "\n";
    if (gzwrite($gz, $csv) === false) {
        echo 'Schreibfehler aufgetreten!' . PHP_EOL;
        break;
    }
}

gzclose($gz);
echo 'CSV-Datei erfolgreich komprimiert gespeichert.';
CSV-Datei erfolgreich komprimiert gespeichert.

Nur die ersten N Bytes schreiben

<?php
$gz = gzopen('teilausgabe.gz', 'w');
$text = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

// Nur die ersten 10 Zeichen schreiben
$bytes = gzwrite($gz, $text, 10);
echo "Geschrieben: " . $bytes . " Bytes" . PHP_EOL; // Schreibt 'ABCDEFGHIJ'

gzclose($gz);
Geschrieben: 10 Bytes

// Wichtig · Fallstricke

Rückgabewert prüfen: Da gzwrite() im Fehlerfall false zurückgibt, sollte immer mit === false verglichen werden — ein einfaches if (!gzwrite(...)) würde auch bei 0 geschriebenen Bytes fälschlicherweise als Fehler interpretiert.

Komprimierungsstufe: Die Komprimierungsstufe wird bereits beim Öffnen der Datei mit gzopen() festgelegt (z. B. 'w9' für maximale Komprimierung). gzwrite() selbst kennt keine Stufe.

Binäre Daten: gzwrite() ist binärsicher und kann auch mit Binärdaten (z. B. serialisierte Objekte, Bilddaten) verwendet werden.

Speicherverbrauch: Bei sehr großen Datenmengen empfiehlt es sich, den Inhalt in Chunks zu schreiben, anstatt alles auf einmal im Speicher zu halten.