Signatur
Beschreibung
eio_open() ist Teil der eio-Erweiterung, die asynchrone I/O-Operationen auf Basis der libeio-Bibliothek ermöglicht. Die Funktion öffnet eine Datei nicht-blockierend: Der aufrufende Prozess wartet nicht auf das Betriebssystem, sondern erhält das Ergebnis (einen Datei-Deskriptor) später über den angegebenen Callback.
Das Verhalten entspricht dem POSIX-Systemaufruf open(2). Über den Parameter $flags werden Zugriffsmodus und Optionen gesteuert (z. B. EIO_O_RDONLY, EIO_O_WRONLY, EIO_O_CREAT), über $mode die Dateiberechtigungen beim Anlegen neuer Dateien (z. B. 0644).
Die Funktion eignet sich besonders in ereignisgesteuerten Architekturen (z. B. zusammen mit libevent oder libev), wo blockierende Datei-I/O vermieden werden soll. Nach dem Aufruf muss die Event-Schleife gestartet werden (z. B. per eio_event_loop()), damit der Callback ausgeführt wird.
Im Callback-Parameter $result wird bei Erfolg ein ganzzahliger POSIX-Datei-Deskriptor übergeben; bei Fehler ist $result -1 und $errcode enthält den Fehlercode. Der Deskriptor muss später explizit mit eio_close() geschlossen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $path Pflicht | string | Pfad zur Datei, die geöffnet werden soll. | |
| $flags Pflicht | int | Bitweise ODER-Verknüpfung von EIO_O_*-Konstanten, z. B. EIO_O_RDONLY, EIO_O_WRONLY, EIO_O_RDWR, EIO_O_CREAT, EIO_O_TRUNC, EIO_O_APPEND usw. |
|
| $mode Pflicht | int | Dateiberechtigungen (Oktalwert) für neu erstellte Dateien, z. B. 0644. Wird ignoriert, wenn EIO_O_CREAT nicht gesetzt ist. |
|
| $pri Pflicht | int | Priorität der Anfrage: EIO_PRI_DEFAULT, EIO_PRI_MIN oder EIO_PRI_MAX. |
|
| $callback Pflicht | callable | Callback-Funktion mit der Signatur function(mixed $data, int $result, resource $req): void. $result ist bei Erfolg der POSIX-Datei-Deskriptor, bei Fehler -1. |
|
| $data | mixed | null | Beliebige benutzerdefinierte Daten, die unverändert an den Callback weitergegeben werden. |
Rückgabewert
eio_req-Ressource zurück, die die laufende Anfrage repräsentiert. Im Fehlerfall wird false zurückgegeben.Beispiele
Datei asynchron öffnen und Inhalt lesen
<?php
// Datei asynchron öffnen und anschließend lesen
function my_read_callback($data, $result, $req)
{
if ($result > 0) {
echo "Gelesene Bytes: " . $result . PHP_EOL;
echo "Inhalt: " . $data['buf'] . PHP_EOL;
} else {
echo "Lesefehler: " . eio_get_last_error($req) . PHP_EOL;
}
// Datei-Deskriptor schließen
eio_close($data['fd'], EIO_PRI_DEFAULT, function() {
echo "Datei geschlossen." . PHP_EOL;
});
}
function my_open_callback($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;
$buf = str_repeat('\0', 1024);
eio_read($result, 1024, 0, EIO_PRI_DEFAULT, 'my_read_callback', ['fd' => $result, 'buf' => &$buf]);
}
eio_open('/tmp/testdatei.txt', EIO_O_RDONLY, 0, EIO_PRI_DEFAULT, 'my_open_callback');
eio_event_loop();
?>
Neue Datei asynchron erstellen und beschreiben
<?php
// Neue Datei erstellen und Daten schreiben
function on_write($data, $result, $req)
{
if ($result === -1) {
echo "Schreibfehler!" . PHP_EOL;
} else {
echo "Geschriebene Bytes: " . $result . PHP_EOL;
}
eio_close($data, EIO_PRI_DEFAULT, function() {
echo "Datei geschlossen." . PHP_EOL;
});
}
function on_open($data, $result, $req)
{
if ($result === -1) {
echo "Datei konnte nicht erstellt werden: " . eio_get_last_error($req) . PHP_EOL;
return;
}
$content = "Asynchron geschrieben!\n";
eio_write($result, $content, strlen($content), 0, EIO_PRI_DEFAULT, 'on_write', $result);
}
$flags = EIO_O_WRONLY | EIO_O_CREAT | EIO_O_TRUNC;
eio_open('/tmp/neue_datei.txt', $flags, 0644, EIO_PRI_DEFAULT, 'on_open');
eio_event_loop();
?>
// Wichtig · Fallstricke
Plattformabhängigkeit: eio_open() steht nur unter POSIX-kompatiblen Systemen (Linux, macOS, BSD) zur Verfügung. Windows wird nicht unterstützt.
Event-Schleife: Ohne Aufruf von eio_event_loop() (oder einer anderen Schleife wie libevent/libev) werden die Callbacks niemals ausgeführt. Insbesondere in langläufigen Server-Prozessen muss sichergestellt werden, dass ausstehende Anfragen abgearbeitet werden.
Ressourcen-Verwaltung: Jeder mit eio_open() geöffnete Datei-Deskriptor muss manuell über eio_close() geschlossen werden. Ein fehlendes Schließen führt zu Datei-Deskriptor-Leaks.
Sicherheit: Pfade sollten vor der Übergabe validiert und ggf. kanonisiert werden (z. B. mit realpath()), um Path-Traversal-Angriffe zu vermeiden.