Start · Sprachen · PHP · Referenz · eio_event_loop

eio_event_loop

Funktion

Verarbeitet alle ausstehenden <code>eio</code>-Requests, indem die libeio-Ereignisschleife so lange abgefragt wird, bis keine Anfragen mehr offen sind.

seit PHP 0.5.0 Kategorie: io

Signatur

eio_event_loop(): void

Beschreibung

eio_event_loop() startet eine blockierende Schleife, die kontinuierlich die interne libeio-Warteschlange abfragt und alle darin enthaltenen asynchronen I/O-Requests abarbeitet, bis die Warteschlange vollständig leer ist. Die Funktion kehrt erst dann zurück, wenn kein ausstehender Request mehr vorhanden ist.

Diese Funktion ist besonders nützlich, wenn die EIO-Extension in einem eigenständigen, nicht-event-basierten PHP-Skript verwendet wird – also ohne externe Event-Loops wie libevent oder libuv. In solchen Szenarien ersetzt eio_event_loop() die manuelle Einbindung von eio_poll() in eine eigene Schleife.

Typischerweise werden zuerst alle gewünschten asynchronen Operationen (z. B. eio_open(), eio_read(), eio_write()) registriert und anschließend einmalig eio_event_loop() aufgerufen, um deren Ausführung anzustoßen und auf den Abschluss zu warten.

In Umgebungen mit einer bestehenden Ereignisschleife (z. B. ReactPHP, AMPHP) sollte stattdessen eio_poll() in die jeweilige Event-Loop integriert werden, da eio_event_loop() blockierend ist und die übergeordnete Schleife dadurch blockieren würde.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

Beispiele

Datei asynchron öffnen und lesen mit eio_event_loop

<?php
// Sicherstellen, dass die EIO-Extension geladen ist
if (!extension_loaded('eio')) {
    die('EIO-Extension nicht verfügbar.');
}

$tempFile = tempnam(sys_get_temp_dir(), 'eio_');
file_put_contents($tempFile, 'Hallo, EIO-Welt!');

// Datei asynchron öffnen
eio_open($tempFile, EIO_O_RDONLY, 0, EIO_PRI_DEFAULT, function ($data, $result) use ($tempFile) {
    if ($result === -1) {
        echo 'Fehler beim Öffnen der Datei.' . PHP_EOL;
        return;
    }

    // Datei asynchron lesen
    eio_read($result, 64, 0, EIO_PRI_DEFAULT, function ($data, $content) use ($result) {
        echo 'Gelesener Inhalt: ' . $content . PHP_EOL;

        // Dateideskriptor asynchron schließen
        eio_close($result, EIO_PRI_DEFAULT, function ($data, $res) {
            echo 'Datei geschlossen.' . PHP_EOL;
        });
    });
});

// Alle registrierten Requests abarbeiten
eio_event_loop();

unlink($tempFile);
Gelesener Inhalt: Hallo, EIO-Welt! Datei geschlossen.

Mehrere asynchrone Stat-Abfragen mit eio_event_loop

<?php
if (!extension_loaded('eio')) {
    die('EIO-Extension nicht verfügbar.');
}

$dateien = ['/etc/hostname', '/etc/os-release'];

foreach ($dateien as $pfad) {
    eio_stat($pfad, EIO_PRI_DEFAULT, function ($data, $result) {
        if ($result === -1) {
            echo 'Fehler bei: ' . $data . PHP_EOL;
        } else {
            echo 'Größe von ' . $data . ': ' . $result['size'] . ' Bytes' . PHP_EOL;
        }
    }, $pfad);
}

// Alle Stat-Requests abarbeiten
eio_event_loop();
Größe von /etc/hostname: 12 Bytes Größe von /etc/os-release: 478 Bytes

// Wichtig · Fallstricke

Blockierendes Verhalten: eio_event_loop() blockiert den aktuellen PHP-Prozess, bis alle Requests abgearbeitet sind. In Umgebungen mit einer bestehenden Event-Loop (z. B. ReactPHP) sollte stattdessen eio_poll() verwendet und in die jeweilige Schleife integriert werden.

Reihenfolge der Callbacks: Die Reihenfolge, in der Callbacks ausgeführt werden, entspricht nicht zwingend der Reihenfolge, in der die Requests registriert wurden – sie hängt von der Ausführungsgeschwindigkeit der jeweiligen I/O-Operationen ab.

Abhängigkeit von der EIO-Extension: Die Funktion ist nur verfügbar, wenn die PECL-Extension eio installiert und geladen ist. Diese ist nicht Teil des PHP-Kerns.