Start · Sprachen · PHP · Referenz · gzpassthru

gzpassthru

Funktion

Liest alle verbleibenden (unkomprimierten) Daten eines gz-Dateizeigers und gibt sie direkt an die Standardausgabe aus.

seit PHP 4.0.0 Kategorie: io

Signatur

gzpassthru(resource $stream): int|false

Beschreibung

gzpassthru() liest ab der aktuellen Position des gz-Dateizeigers alle noch nicht gelesenen Daten und schreibt sie unkomprimiert direkt in den Ausgabepuffer (Standard-Output). Die Funktion arbeitet dabei ähnlich wie passthru() oder fpassthru(), jedoch speziell für mit gzopen() geöffnete gz-komprimierte Dateien.

Die Funktion ist besonders nützlich, wenn eine gz-Datei transparent an den Browser oder ein anderes Ausgabeziel weitergeleitet werden soll, ohne den gesamten Inhalt zunächst in eine PHP-Variable einzulesen. Das spart Arbeitsspeicher, da die Daten gestreamt werden.

Wurde der Dateizeiger bereits teilweise vorwärts bewegt (z. B. durch vorherige gzread()- oder gzgets()-Aufrufe), gibt gzpassthru() nur die verbleibenden, noch nicht gelesenen Daten aus. Sollen alle Daten ausgegeben werden, muss der Zeiger zuvor mit gzrewind() an den Anfang gesetzt werden.

Nach dem Aufruf ist die Datei vollständig gelesen und sollte mit gzclose() geschlossen werden, um Ressourcen freizugeben.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Ein gültiger gz-Dateizeiger, wie er von gzopen() zurückgegeben wird.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der ausgegebenen (unkomprimierten) Bytes zurück, oder false im Fehlerfall.

Beispiele

Gesamten Inhalt einer gz-Datei ausgeben

<?php
// gz-Datei öffnen
$gz = gzopen('/var/data/report.txt.gz', 'rb');
if ($gz === false) {
    die('Datei konnte nicht geöffnet werden.');
}

// Passenden Content-Type setzen (Inhalt wird unkomprimiert gesendet)
header('Content-Type: text/plain; charset=utf-8');

// Alle unkomprimierten Daten direkt ausgeben
$bytes = gzpassthru($gz);
echo "\n\n/* $bytes Bytes ausgegeben */";

gzclose($gz);
(Inhalt der unkomprimierten Datei, gefolgt von der Byte-Anzahl)

Nur verbleibende Daten nach partiellem Lesen ausgeben

<?php
$gz = gzopen('/var/data/log.gz', 'rb');
if ($gz === false) {
    die('Datei nicht gefunden.');
}

// Erste Zeile separat lesen und verarbeiten
$firstLine = gzgets($gz);
echo 'Erste Zeile: ' . htmlspecialchars($firstLine) . PHP_EOL;
echo '--- Rest der Datei ---' . PHP_EOL;

// Alle verbleibenden Zeilen direkt ausgeben
$bytes = gzpassthru($gz);
echo PHP_EOL . "/* Noch $bytes Bytes ausgegeben */";

gzclose($gz);
Erste Zeile: [erste Zeile des Logs] --- Rest der Datei --- [restlicher Log-Inhalt] /* ... Bytes ausgegeben */

// Wichtig · Fallstricke

Ressourcenfreigabe: gzpassthru() schließt den Dateizeiger nicht automatisch. gzclose() sollte nach dem Aufruf explizit aufgerufen werden.

Ausgabepufferung: Wenn ob_start() aktiv ist, landen die Daten im Ausgabepuffer statt direkt im Browser. Bei großen Dateien kann das zu hohem Speicherverbrauch führen. Ggf. ob_end_flush() vorher aufrufen.

Binärdateien: Unter Windows sollte die Datei im Binärmodus ('rb') geöffnet werden, um Zeilenumbruch-Konvertierungen zu vermeiden.