Start · Sprachen · PHP · Referenz · readgzfile

readgzfile

Funktion

Liest eine gz-komprimierte Datei, dekomprimiert sie und gibt den Inhalt direkt an den Ausgabepuffer aus.

seit PHP 4.0.0 Kategorie: io

Signatur

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

Beschreibung

readgzfile() öffnet eine gzip-komprimierte Datei, dekomprimiert deren Inhalt und schreibt ihn unmittelbar in den PHP-Ausgabepuffer – ähnlich wie readfile() für unkomprimierte Dateien. Die Funktion gibt die Anzahl der unkomprimierten Bytes zurück, die ausgegeben wurden.

Typischer Einsatzzweck ist das direkte Ausliefern komprimierter Dateien an den Browser oder das Schreiben dekomprimierten Inhalts in eine Pipe bzw. stdout. Da die Datei in einem Schritt geöffnet, gelesen und ausgegeben wird, entfällt der manuelle Umgang mit Datei-Handles.

Wenn der optionale Parameter use_include_path auf 1 gesetzt wird, sucht PHP zusätzlich in den in der php.ini definierten include_path-Verzeichnissen nach der Datei. Dies ist nützlich, wenn komprimierte Ressourcen zentral abgelegt werden.

Schlägt das Öffnen der Datei fehl – etwa weil sie nicht existiert oder die Zugriffsrechte fehlen – gibt die Funktion false zurück und erzeugt eine Warnung. Es empfiehlt sich daher, den Rückgabewert stets zu prüfen.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur gz-komprimierten Datei (lokal oder über unterstützte Stream-Wrapper wie file://). Nicht dekomprimierte Dateien werden so ausgegeben, wie sie sind.
$use_include_path int 0 Wenn auf 1 gesetzt, wird die Datei auch in den in der include_path-Direktive definierten Verzeichnissen gesucht.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der unkomprimiert ausgegebenen Bytes als int zurück. Bei einem Fehler (Datei nicht gefunden, keine Leseberechtigung etc.) wird false zurückgegeben und eine Warnung ausgegeben.

Beispiele

Komprimierte Textdatei direkt ausgeben

<?php
// Einfaches Ausliefern einer komprimierten Log-Datei
header('Content-Type: text/plain');
header('Content-Encoding: identity'); // Kein erneutes gzip durch den Browser

$bytes = readgzfile('/var/logs/app.log.gz');

if ($bytes === false) {
    http_response_code(500);
    echo 'Datei konnte nicht gelesen werden.';
} else {
    // $bytes enthält die Anzahl der unkomprimiert gesendeten Bytes
    error_log('Gesendet: ' . $bytes . ' Bytes');
}
(Inhalt der dekomprimierten Datei wird direkt ausgegeben)

Komprimiertes Backup zum Download anbieten

<?php
$file = '/backups/datenbank_2024-01-15.sql.gz';

if (!file_exists($file)) {
    http_response_code(404);
    exit('Backup nicht gefunden.');
}

// Dekomprimiert als SQL-Datei ausliefern
header('Content-Type: application/sql');
header('Content-Disposition: attachment; filename="datenbank_2024-01-15.sql"');

$bytes = readgzfile($file);

if ($bytes === false) {
    http_response_code(500);
    exit('Fehler beim Lesen der Backup-Datei.');
}

// Optionaler Log-Eintrag
error_log('Backup ausgeliefert: ' . $bytes . ' Bytes dekomprimiert.');
(dekomprimierter SQL-Dump wird als Download gesendet)

// Wichtig · Fallstricke

Sicherheit: Übergeben Sie niemals benutzerkontrollierte Werte direkt als $filename, da dies Path-Traversal-Angriffe ermöglicht (z. B. ../../etc/passwd.gz). Validieren und säubern Sie Pfadangaben stets, z. B. mit realpath() und einer Whitelist erlaubter Verzeichnisse.

Ausgabepuffer: Da readgzfile() direkt in den Ausgabepuffer schreibt, sollten Sie vorher sicherstellen, dass noch keine unbeabsichtigten Ausgaben erfolgt sind, wenn Sie HTTP-Header senden möchten. Verwenden Sie ggf. ob_clean() vor dem Aufruf.

Speicherverbrauch: Die gesamte Datei wird intern in Blöcken verarbeitet, ist jedoch für sehr große Dateien eventuell speicherintensiver als eine manuelle Block-Verarbeitung mit gzopen() und gzread().

Nicht-gzip-Dateien: Wenn die angegebene Datei keine gzip-Datei ist, wird ihr Inhalt unverändert ausgegeben – ähnlich wie bei readfile().