Start · Sprachen · PHP · Referenz · gzfile

gzfile

Funktion

Liest eine gzip-komprimierte Datei zeilenweise ein und gibt den dekomprimierten Inhalt als Array zurück.

seit PHP 4.0.0 Kategorie: io

Signatur

gzfile(string $filename, int $use_include_path = 0): array|false

Beschreibung

gzfile() öffnet eine gzip-komprimierte Datei, dekomprimiert sie und gibt jede Zeile des Inhalts als einzelnes Element eines Arrays zurück – inklusive der jeweiligen Zeilenumbrüche. Die Funktion ist das gzip-Äquivalent zur Standard-Funktion file() und eignet sich ideal, wenn komprimierte Textdateien (z. B. Log-Dateien oder CSV-Exporte) schnell und ohne manuelles Öffnen/Schließen eingelesen werden sollen.

Intern kombiniert die Funktion das Verhalten von gzopen(), gzread() und gzclose() in einem einzigen Aufruf. Der Dateiname kann eine lokale Datei oder – sofern allow_url_fopen aktiv ist – eine URL sein. Neben lokalen .gz-Dateien unterstützt PHP transparente Dateistream-Wrapper.

Wenn die gesamte Datei im Speicher gehalten werden kann und keine streaming-basierte Verarbeitung benötigt wird, ist gzfile() die bequemste Option. Für sehr große Dateien empfiehlt sich stattdessen gzopen() in Kombination mit gzgets(), um Zeile für Zeile zu verarbeiten, ohne den gesamten Inhalt auf einmal in den Speicher zu laden.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur gzip-komprimierten Datei. Kann ein absoluter oder relativer Dateipfad sein. Unterstützt auch URLs, wenn allow_url_fopen in der php.ini aktiviert ist.
$use_include_path int 0 Wird dieser Parameter auf 1 gesetzt, sucht PHP zusätzlich in den in include_path definierten Verzeichnissen nach der Datei.

Rückgabewert

Typ
array|false
Beschreibung
Gibt im Erfolgsfall ein Array zurück, bei dem jedes Element einer Zeile der dekomprimierten Datei entspricht (inklusive Zeilenumbruch am Ende). Im Fehlerfall – etwa wenn die Datei nicht gefunden oder nicht geöffnet werden kann – wird false zurückgegeben.

Beispiele

Inhalt einer gz-Datei einlesen und ausgeben

<?php
// Liest eine gzip-komprimierte Textdatei ein
$lines = gzfile('/var/log/app.log.gz');

if ($lines === false) {
    echo 'Fehler beim Lesen der Datei.';
} else {
    foreach ($lines as $lineNumber => $line) {
        echo ($lineNumber + 1) . ': ' . htmlspecialchars($line);
    }
}
?>
1: [2024-01-01 00:00:00] Application started 2: [2024-01-01 00:00:05] User logged in ...

Komprimierte CSV-Datei verarbeiten

<?php
// CSV-Daten aus einer gz-Datei lesen und parsen
$lines = gzfile('data/export.csv.gz');

if ($lines === false) {
    throw new RuntimeException('Datei konnte nicht gelesen werden.');
}

$header = null;
$records = [];

foreach ($lines as $line) {
    $fields = str_getcsv(trim($line));
    if ($header === null) {
        $header = $fields;
    } else {
        $records[] = array_combine($header, $fields);
    }
}

var_dump(count($records) . ' Datensätze eingelesen.');
?>
string(28) "42 Datensätze eingelesen."

// Wichtig · Fallstricke

Speicherverbrauch: Da gzfile() den gesamten Dateiinhalt dekomprimiert und als Array im Speicher hält, kann es bei großen Dateien zu hohem Speicherverbrauch kommen. gzip-Dateien können nach der Dekompression um ein Vielfaches ihrer komprimierten Größe anwachsen. Für große Dateien sollte stattdessen gzopen() mit zeilenweisem Lesen über gzgets() genutzt werden.

Fehlerbehandlung: Der Rückgabewert sollte stets mit === false geprüft werden, da ein leeres Array ebenfalls einen falsy-Wert darstellt, aber technisch erfolgreich ist.

Zeilenumbrüche: Die Zeilenumbrüche (\n bzw. \r\n) werden am Ende jeder Zeile mitgegeben, ähnlich wie bei file(). Mit trim() oder rtrim() können sie entfernt werden.