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