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