Signatur
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
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');
}
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.');
// 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().