Start · Sprachen · PHP · Referenz · eio_open

eio_open

Funktion

Öffnet eine Datei asynchron über die <code>eio</code>-Erweiterung und liefert das Ergebnis über einen Callback.

seit PHP 0.0.1 Kategorie: io

Signatur

eio_open(string $path, int $flags, int $mode, int $pri, callable $callback, mixed $data = null): resource

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

Typ
resource
Beschreibung
Gibt bei Erfolg eine 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();
?>
Datei geöffnet, Deskriptor: 5 Gelesene Bytes: 13 Inhalt: Hello, World! Datei geschlossen.

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();
?>
Geschriebene Bytes: 22 Datei geschlossen.

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