Start · Sprachen · PHP · Referenz · dio_seek

dio_seek

Funktion

Setzt den Dateizeiger eines direkt geöffneten Dateideskriptors auf eine angegebene Position.

seit PHP 4.2.0 Kategorie: io

Signatur

dio_seek(resource $fd, int $pos, int $whence = SEEK_SET): int

Beschreibung

dio_seek() verschiebt den internen Dateizeiger eines mit dio_open() geöffneten Dateideskriptors auf eine bestimmte Position. Die Funktion arbeitet direkt auf dem Betriebssystem-Level und umgeht dabei den PHP-internen Puffer, was sie besonders für Low-Level-Dateioperationen geeignet macht.

Der Parameter $whence bestimmt, wie $pos interpretiert wird: Mit SEEK_SET (Standard) wird die Position absolut vom Dateianfang gesetzt, mit SEEK_CUR relativ zur aktuellen Position und mit SEEK_END relativ zum Dateiende (negative Werte erlaubt).

dio_seek() ist sinnvoll, wenn man gezielt Binärdaten an beliebigen Stellen einer Datei lesen oder schreiben möchte, ohne vorherigen Inhalt sequenziell durchlaufen zu müssen. Typische Einsatzgebiete sind das Arbeiten mit binären Dateiformaten, Datenbank-ähnlichen Flat-Files oder speziellen Systemdateien.

Hinweis: Die dio-Erweiterung ist eine PECL-Erweiterung und nicht standardmäßig in PHP enthalten. Sie muss separat installiert und aktiviert werden.

Parameter

Name Typ Default Beschreibung
$fd Pflicht resource Ein gültiger Dateideskriptor, wie er von dio_open() zurückgegeben wird.
$pos Pflicht int Die Zielposition in Bytes. Interpretation abhängig von $whence: absolut, relativ zur aktuellen Position oder relativ zum Dateiende.
$whence int SEEK_SET Legt die Referenz für $pos fest. Mögliche Werte: SEEK_SET (0, ab Dateianfang), SEEK_CUR (1, ab aktueller Position), SEEK_END (2, ab Dateiende).

Rückgabewert

Typ
int
Beschreibung
Gibt 0 zurück, wenn die Positionierung erfolgreich war. Bei einem Fehler wird ein Wert ungleich 0 zurückgegeben.

Beispiele

Absolutes Springen zu einer Dateiposition

<?php
// Datei öffnen (Lese- und Schreibzugriff)
$fd = dio_open('/tmp/beispiel.bin', O_RDWR | O_CREAT);

if ($fd === false) {
    die('Datei konnte nicht geöffnet werden.');
}

// 100 Bytes ab Dateianfang schreiben
dio_write($fd, str_repeat('\x00', 100));

// Zeiger auf absolute Position 50 setzen
$result = dio_seek($fd, 50, SEEK_SET);

if ($result === 0) {
    // 10 Bytes ab Position 50 lesen
    $data = dio_read($fd, 10);
    echo 'Gelesene Bytes: ' . strlen($data) . PHP_EOL;
} else {
    echo 'Fehler beim Positionieren.' . PHP_EOL;
}

dio_close($fd);
Gelesene Bytes: 10

Zeiger relativ zum Dateiende setzen

<?php
// Datei öffnen
$fd = dio_open('/tmp/daten.bin', O_RDONLY);

if ($fd === false) {
    die('Datei konnte nicht geöffnet werden.');
}

// Letzten 20 Bytes der Datei lesen
$result = dio_seek($fd, -20, SEEK_END);

if ($result === 0) {
    $letzteBytes = dio_read($fd, 20);
    echo 'Letzte 20 Bytes gelesen: ' . bin2hex($letzteBytes) . PHP_EOL;
} else {
    echo 'Seek fehlgeschlagen.' . PHP_EOL;
}

dio_close($fd);

// Wichtig · Fallstricke

PECL-Erweiterung: dio_seek() gehört zur dio-Erweiterung, die separat über PECL installiert werden muss (pecl install dio). Auf vielen Systemen ist sie nicht standardmäßig verfügbar.

Kein Rückfall auf Standard-PHP: Die dio-Funktionen sind kein Ersatz für die normalen PHP-Dateifunktionen (fseek(), fread() etc.), sondern bieten direkten Zugriff auf POSIX-Systemaufrufe. Für die meisten Anwendungsfälle ist fseek() vorzuziehen, da es plattformübergreifend besser unterstützt wird.

Fehlerbehandlung: Der Rückgabewert sollte stets geprüft werden. Ein Wert ungleich 0 deutet auf einen Fehler hin, der z. B. durch eine ungültige Position oder einen ungültigen Deskriptor verursacht sein kann.