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