Start · Sprachen · PHP · Referenz · gzseek

gzseek

Funktion

Positioniert den Dateizeiger einer geöffneten gz-Datei auf eine bestimmte Position.

seit PHP 4.0.0 Kategorie: io

Signatur

gzseek(resource $stream, int $offset, int $whence = SEEK_SET): int

Beschreibung

gzseek() setzt den Dateizeiger eines mit gzopen() geöffneten gz-Streams auf die angegebene Position. Das Verhalten ist ähnlich wie bei fseek(), allerdings mit den Einschränkungen, die durch das gzip-Kompressionsformat entstehen.

Da gzip-Dateien keine echte wahlfreie Positionierung (Random Access) unterstützen, emuliert PHP beim Rückwärtssuchen das Seek-Verhalten, indem es die Datei von Anfang an neu liest und dekomprimiert. Bei großen Dateien kann dies zu erheblichem Leistungsverlust führen. Vorwärts-Seeks sind effizienter, da die Daten nur bis zur Zielposition gelesen werden müssen.

Nützlich ist gzseek() etwa, wenn man in einer komprimierten Datei an eine bekannte Position springen möchte, ohne die gesamte Datei vorher vollständig zu lesen – z. B. um einen bestimmten Abschnitt einer Log-Datei zu verarbeiten.

Der Parameter whence akzeptiert die gleichen Konstanten wie fseek(): SEEK_SET, SEEK_CUR und SEEK_END. Allerdings wird SEEK_END bei gzip-Dateien nicht unterstützt und führt zu einem Fehler.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Eine gültige gz-Datei-Ressource, die zuvor mit gzopen() geöffnet wurde.
$offset Pflicht int Die Anzahl der Bytes, um die der Zeiger verschoben werden soll. Interpretation hängt von whence ab.
$whence int SEEK_SET Bestimmt, wie offset interpretiert wird: SEEK_SET (absolut vom Anfang), SEEK_CUR (relativ zur aktuellen Position). SEEK_END wird bei gz-Dateien nicht unterstützt.

Rückgabewert

Typ
int
Beschreibung
Gibt 0 bei Erfolg zurück, -1 bei einem Fehler (z. B. ungültiger whence-Wert oder ungültige Ressource).

Beispiele

Vorwärts-Seek in einer gz-Datei

<?php
$gz = gzopen('beispiel.gz', 'r');
if ($gz === false) {
    die('Datei konnte nicht geöffnet werden.');
}

// Die ersten 100 Bytes überspringen
$result = gzseek($gz, 100, SEEK_SET);
if ($result === 0) {
    // Ab Position 100 lesen
    $inhalt = gzread($gz, 200);
    echo 'Gelesener Inhalt: ' . $inhalt;
} else {
    echo 'Seek fehlgeschlagen.';
}

gzclose($gz);
Gelesener Inhalt: [200 Bytes ab Position 100]

Relativer Seek mit SEEK_CUR

<?php
$gz = gzopen('protokoll.gz', 'r');
if ($gz === false) {
    die('Datei konnte nicht geöffnet werden.');
}

// Erste Zeile lesen
$zeile = gzgets($gz);
echo 'Erste Zeile: ' . $zeile;

// Aktuelle Position um 50 Bytes vorwärts verschieben
$result = gzseek($gz, 50, SEEK_CUR);
if ($result === 0) {
    $naechste = gzgets($gz);
    echo 'Nach dem Sprung: ' . $naechste;
} else {
    echo 'Seek fehlgeschlagen.';
}

gzclose($gz);
Erste Zeile: [Inhalt der ersten Zeile] Nach dem Sprung: [Inhalt nach 50 übersprungenen Bytes]

// Wichtig · Fallstricke

Leistungshinweis: Bei Rückwärts-Seeks muss PHP die gesamte Datei ab dem Anfang neu dekomprimieren, da das gzip-Format kein echtes Random Access unterstützt. Bei sehr großen Dateien sollte man deshalb Rückwärts-Seeks möglichst vermeiden.

SEEK_END nicht unterstützt: Im Gegensatz zu fseek() kann gzseek() nicht mit SEEK_END verwendet werden. Versuche, vom Dateiende aus zu suchen, schlagen fehl und geben -1 zurück.

Die aktuelle Dateiposition kann mit gztell() abgefragt werden. Um den Zeiger wieder an den Anfang zu setzen, kann gzrewind() verwendet werden, was effizienter als gzseek($gz, 0) ist.