Start · Sprachen · PHP · Referenz · gzgets

gzgets

Funktion

Liest eine Zeile aus einem geöffneten, gzip-komprimierten Datei-Handle und gibt den dekomprimierten Inhalt zurück.

seit PHP 4.0.0 Kategorie: io

Signatur

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

Beschreibung

gzgets() liest aus einem mit gzopen() geöffneten Datei-Handle eine Zeile und dekomprimiert sie dabei automatisch. Die Funktion verhält sich analog zu fgets(), arbeitet jedoch mit gzip-komprimierten Dateien (.gz).

Das Lesen endet, sobald $length - 1 Bytes gelesen wurden, ein Zeilenumbruch (\n) gefunden wurde oder das Ende der Datei (EOF) erreicht wurde — je nachdem, was zuerst eintritt. Der Zeilenumbruch selbst ist im zurückgegebenen String enthalten.

Wird $length weggelassen, liest die Funktion bis zum nächsten Zeilenumbruch oder EOF. Dies ist praktisch für das zeilenweise Verarbeiten großer gzip-komprimierter Textdateien wie Log-Dateien, CSV-Exporte oder Konfigurationen, ohne die gesamte Datei auf einmal in den Speicher laden zu müssen.

Typischer Einsatz ist das Iterieren über komprimierte Textdateien in einer while-Schleife bis gzeof() true zurückliefert.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Ein gültiges Datei-Handle, das zuvor mit gzopen() im Lese-Modus geöffnet wurde.
$length ?int null Maximale Anzahl der zu lesenden Bytes (inkl. Zeilenumbruch). Wird null übergeben oder weggelassen, liest die Funktion bis zum nächsten Zeilenumbruch oder EOF. Muss, wenn angegeben, größer als 0 sein.

Rückgabewert

Typ
string|false
Beschreibung
Gibt die gelesene (und dekomprimierte) Zeile als string zurück. Im Fehlerfall oder bei einem sofortigen EOF wird false zurückgegeben.

Beispiele

Zeilenweises Lesen einer gzip-komprimierten Textdatei

<?php
$handle = gzopen('/var/log/access.log.gz', 'rb');

if ($handle === false) {
    die('Datei konnte nicht geöffnet werden.');
}

while (!gzeof($handle)) {
    $line = gzgets($handle);
    if ($line !== false) {
        echo htmlspecialchars($line);
    }
}

gzclose($handle);

Lesen mit begrenzter Zeilenlänge und Verarbeitung als CSV

<?php
$handle = gzopen('daten.csv.gz', 'rb');

if ($handle === false) {
    die('Fehler beim Öffnen der komprimierten CSV-Datei.');
}

$zeilennummer = 0;
while (!gzeof($handle)) {
    $zeile = gzgets($handle, 4096);
    if ($zeile === false) {
        break;
    }
    $felder = str_getcsv(trim($zeile), ';');
    $zeilennummer++;
    echo "Zeile {$zeilennummer}: " . implode(' | ', $felder) . PHP_EOL;
}

gzclose($handle);

// Wichtig · Fallstricke

Fallstrick: Der Rückgabewert muss mit === false (strikt) geprüft werden, da eine leere Zeile einen leeren String zurückliefert, der bei loser Prüfung (== false) ebenfalls als falsch gilt.

Encoding: gzgets() dekomprimiert intern, gibt jedoch rohe Bytes zurück. Bei UTF-8-Dateien oder anderen Zeichenkodierungen ist keine automatische Konvertierung eingebaut — die Dekodierung muss bei Bedarf manuell erfolgen (z. B. mit mb_convert_encoding()).

Performance: Für sehr große komprimierte Dateien ist das zeilenweise Lesen mit gzgets() speichereffizienter als das vollständige Laden mit gzfile(), das die gesamte Datei als Array in den RAM lädt.