Signatur
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
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.