Start · Sprachen · PHP · Referenz · eio_fstat

eio_fstat

Funktion

Ermittelt asynchron den Status einer geöffneten Datei anhand ihres Dateideskriptors und ruft nach Abschluss die Callback-Funktion auf.

seit PHP 0.0.1 Kategorie: io

Signatur

eio_fstat(mixed $fd, int $pri, callable $callback, mixed $data = null): resource

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

Typ
resource
Beschreibung
Gibt eine EIO-Request-Ressource zurück, die den eingereihten Vorgang repräsentiert. Im Fehlerfall wird 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();
Dateigröße : 10 Bytes Inode : 123456 Letzter Zugriff : 2024-05-01 12:00:00

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.";
}
Request erfolgreich abgebrochen.

// 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.