Signatur
Beschreibung
eio_fstat() gehört zur EIO-Erweiterung (asynchrone POSIX-I/O-Operationen) und entspricht funktional dem POSIX-Systemaufruf fstat(2). Im Gegensatz zu stat() oder lstat() arbeitet diese Funktion nicht mit einem Dateipfad, sondern mit einem bereits geöffneten Dateideskriptor – typischerweise dem Rückgabewert von eio_open().
Die Operation wird nicht-blockierend in den EIO-Warteschlange eingereiht. Sobald das Betriebssystem den Status ermittelt hat, wird die angegebene $callback-Funktion aufgerufen. Diese erhält u. a. ein assoziatives Array mit Metadaten zur Datei (Größe, Inode, Zugriffszeiten, Berechtigungen usw.).
Typische Einsatzgebiete sind Hochleistungs-Server oder Event-getriebene Anwendungen, bei denen synchrone I/O-Calls die Event-Schleife blockieren würden. eio_fstat() lässt sich gut mit libevent oder dem Event-PECL-Paket kombinieren.
Das zurückgegebene resource-Objekt repräsentiert den angefragten EIO-Request und kann mit eio_cancel() abgebrochen werden, solange er noch nicht verarbeitet wurde.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $fd Pflicht | mixed | Dateideskriptor der bereits geöffneten Datei, wie er etwa von eio_open() im Callback übergeben wird. |
|
| $pri Pflicht | int | Priorität des Requests. Mögliche Werte: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX oder null (entspricht EIO_PRI_DEFAULT). |
|
| $callback Pflicht | callable | Callback-Funktion mit der Signatur callback(mixed $data, mixed $result, resource $req). $result ist ein assoziatives Array mit den Stat-Feldern (z. B. size, ino, mode, mtime usw.) oder -1 bei einem Fehler. |
|
| $data | mixed | null | Beliebige benutzerdefinierte Daten, die unverändert an den $callback weitergegeben werden. Nützlich, um Kontext (z. B. Dateipfad oder Verbindungs-IDs) durch die asynchrone Pipeline zu schleusen. |
Rückgabewert
false zurückgegeben. Mit eio_cancel() kann der Request abgebrochen werden, solange er noch nicht verarbeitet wurde.Beispiele
Dateiinformationen asynchron abfragen
<?php
// EIO-Erweiterung muss geladen sein: pecl install eio
$path = '/tmp/testfile.txt';
file_put_contents($path, 'Hello EIO!');
// Datei asynchron öffnen
eio_open(
$path,
EIO_O_RDONLY,
0,
EIO_PRI_DEFAULT,
function ($data, $result, $req) use ($path) {
if ($result === -1) {
echo "Fehler beim Öffnen: " . eio_get_last_error($req) . PHP_EOL;
return;
}
$fd = $result;
// Dateistatus des geöffneten Deskriptors ermitteln
eio_fstat(
$fd,
EIO_PRI_DEFAULT,
function ($data, $result, $req) use ($fd) {
if ($result === -1) {
echo "fstat-Fehler: " . eio_get_last_error($req) . PHP_EOL;
} else {
echo "Dateigröße : " . $result['size'] . " Bytes" . PHP_EOL;
echo "Inode : " . $result['ino'] . PHP_EOL;
echo "Letzter Zugriff : " . date('Y-m-d H:i:s', $result['atime']) . PHP_EOL;
}
// Dateideskriptor schließen
eio_close($fd, EIO_PRI_DEFAULT, null);
},
'fstat-context'
);
}
);
// EIO-Event-Schleife starten
eio_event_loop();
Request-Abbruch mit eio_cancel()
<?php
// Beispiel: Request einreihen und sofort wieder abbrechen
$fd = 3; // hypothetischer Dateideskriptor
$req = eio_fstat(
$fd,
EIO_PRI_DEFAULT,
function ($data, $result, $req) {
echo "Wird nicht aufgerufen, da abgebrochen." . PHP_EOL;
}
);
if ($req) {
$cancelled = eio_cancel($req);
echo $cancelled ? "Request erfolgreich abgebrochen." : "Abbruch nicht möglich.";
}
// Wichtig · Fallstricke
Voraussetzung: Die EIO-Erweiterung muss über PECL installiert und in der php.ini geladen sein (extension=eio). Sie ist nicht Teil der PHP-Standarddistribution.
Die Stat-Felder im $result-Array entsprechen weitgehend denen von PHP-stat() (z. B. dev, ino, mode, nlink, uid, gid, size, atime, mtime, ctime).
Im Fehlerfall ist $result im Callback gleich -1; die genaue Fehlerursache lässt sich mit eio_get_last_error($req) abfragen.
Achtung: Der Dateideskriptor $fd muss zum Zeitpunkt der Callback-Ausführung noch gültig sein. Ein vorzeitiges Schließen mit eio_close() oder fclose() führt zu undefiniertem Verhalten.