Start · Sprachen · PHP · Referenz · eio_close

eio_close

Funktion

Schließt einen Dateideskriptor asynchron (nicht-blockierend) über die <code>eio</code>-Erweiterung.

seit PHP 0.5.0 Kategorie: io

Signatur

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

Beschreibung

eio_close() schließt den übergebenen Dateideskriptor asynchron. Die Funktion gehört zur eio-Erweiterung, die auf libeio basiert und echte asynchrone I/O-Operationen für PHP bereitstellt. Im Gegensatz zum blockierenden fclose() kehrt eio_close() sofort zurück, während die eigentliche Schließ-Operation im Hintergrund durch den libeio-Thread-Pool ausgeführt wird.

Die Funktion ist besonders dann sinnvoll, wenn in Event-Loop-basierten Anwendungen (z. B. mit ReactPHP oder Ev) Dateideskriptoren geschlossen werden müssen, ohne den Haupt-Thread zu blockieren. Sobald die Operation abgeschlossen ist, wird die angegebene Callback-Funktion aufgerufen.

Der Callback erhält drei Argumente: $data (die benutzerdefiniert übergebenen Daten), $result (0 bei Erfolg, -1 bei Fehler) und $req (die Request-Ressource). Im Fehlerfall kann eio_get_last_error($req) aufgerufen werden, um den Fehlercode zu ermitteln.

  • Typischerweise wird eio_close() nach asynchronen Lese-/Schreiboperationen aufgerufen, wenn der Dateideskriptor nicht mehr benötigt wird.
  • Die eio-Erweiterung muss als PECL-Paket installiert sein und wird von libeio unterstützt.

Parameter

Name Typ Default Beschreibung
$fd Pflicht mixed Der zu schließende Dateideskriptor. Kann eine Integer-Ressource (nativer Dateideskriptor) oder eine Stream-Ressource sein, die von Funktionen wie eio_open() zurückgegeben wurde.
$pri int EIO_PRI_DEFAULT Priorität der Anfrage. Mögliche Werte: EIO_PRI_MIN, EIO_PRI_DEFAULT, EIO_PRI_MAX. Bestimmt die Reihenfolge der Ausführung in der libeio-Warteschlange.
$callback callable null Eine Callback-Funktion, die nach Abschluss der Operation aufgerufen wird. Signatur: function($data, $result, $req): void. $result ist 0 bei Erfolg oder -1 bei einem Fehler.
$data mixed null Beliebige benutzerdefinierte Daten, die unverändert als erstes Argument an den Callback übergeben werden. Nützlich, um Kontextinformationen weiterzureichen.

Rückgabewert

Typ
resource
Beschreibung
Gibt eine eio-Request-Ressource zurück, die die asynchrone Operation repräsentiert, oder false im Fehlerfall. Die Ressource kann z. B. mit eio_cancel() verwendet werden, um die Operation abzubrechen.

Beispiele

Datei asynchron öffnen und schließen

<?php
// Datei asynchron öffnen und nach dem Öffnen sofort wieder schließen
eio_open(
    '/tmp/testfile.txt',
    EIO_O_CREAT | EIO_O_WRONLY,
    0644,
    EIO_PRI_DEFAULT,
    function ($data, $result, $req) {
        if ($result === -1) {
            echo 'Fehler beim Öffnen: ' . eio_get_last_error($req) . PHP_EOL;
            return;
        }

        echo 'Datei geöffnet, Deskriptor: ' . $result . PHP_EOL;

        // Dateideskriptor asynchron schließen
        eio_close(
            $result,
            EIO_PRI_DEFAULT,
            function ($data, $closeResult, $req) {
                if ($closeResult === 0) {
                    echo 'Datei erfolgreich geschlossen.' . PHP_EOL;
                } else {
                    echo 'Fehler beim Schließen: ' . eio_get_last_error($req) . PHP_EOL;
                }
            }
        );
    }
);

eio_event_loop();
?>
Datei geöffnet, Deskriptor: 5 Datei erfolgreich geschlossen.

Kontextdaten über den Callback weitergeben

<?php
// Benutzerdefinierte Daten an den Callback übergeben
$context = ['filename' => '/tmp/demo.txt', 'timestamp' => time()];

eio_open(
    $context['filename'],
    EIO_O_CREAT | EIO_O_RDWR,
    0600,
    EIO_PRI_DEFAULT,
    function ($data, $fd, $req) {
        if ($fd === -1) {
            echo 'Öffnen fehlgeschlagen.' . PHP_EOL;
            return;
        }

        eio_close(
            $fd,
            EIO_PRI_DEFAULT,
            function ($data, $result, $req) {
                echo sprintf(
                    'Datei "%s" (geöffnet um %s) wurde %s geschlossen.',
                    $data['filename'],
                    date('H:i:s', $data['timestamp']),
                    $result === 0 ? 'erfolgreich' : 'fehlerhaft'
                ) . PHP_EOL;
            },
            $data // Kontext durchreichen
        );
    },
    $context
);

eio_event_loop();
?>
Datei "/tmp/demo.txt" (geöffnet um 14:32:10) wurde erfolgreich geschlossen.

// Wichtig · Fallstricke

Reihenfolge der Operationen: Da alle eio_*-Funktionen asynchron arbeiten, darf eio_close() erst aufgerufen werden, wenn alle vorherigen Lese-/Schreiboperationen auf dem Dateideskriptor abgeschlossen sind. Andernfalls kann es zu undefiniertem Verhalten kommen. Die korrekte Vorgehensweise ist, eio_close() aus dem Callback der letzten I/O-Operation heraus aufzurufen.

Event-Loop: eio_event_loop() muss aufgerufen werden, damit ausstehende Anfragen verarbeitet werden. In Kombination mit Erweiterungen wie Ev oder libevent kann stattdessen ein entsprechender Watcher für den eio-Notify-Dateideskriptor (eio_get_event_stream()) eingerichtet werden.

Verfügbarkeit: Die eio-Erweiterung ist nicht im PHP-Kern enthalten und muss über PECL installiert werden. Sie ist primär auf POSIX-Systemen (Linux, macOS) verfügbar; Windows wird nicht vollständig unterstützt.