Start · Sprachen · PHP · Referenz · eio_poll

eio_poll

Funktion

Verarbeitet ausstehende <code>eio</code>-Requests und schließt abgeschlossene Callbacks ab.

seit PHP 0.0.1 Kategorie: io

Signatur

eio_poll(): void

Beschreibung

eio_poll() ist eine Kernfunktion der eio-Erweiterung, die asynchrone I/O-Operationen auf Basis der libeio-Bibliothek bereitstellt. Sie prüft, ob seit dem letzten Aufruf I/O-Requests fertiggestellt wurden, und ruft für jeden abgeschlossenen Request den entsprechenden Callback auf.

Typischerweise wird eio_poll() in einem Event-Loop verwendet: Sobald der Notification-File-Descriptor (abrufbar über eio_get_event_stream()) lesbar wird, signalisiert dies, dass mindestens ein Request abgeschlossen ist. In diesem Moment ruft man eio_poll() auf, um alle fertigen Requests zu verarbeiten und die zugehörigen PHP-Callbacks auszuführen.

Ohne einen Event-Loop – z. B. in einfachen Skripten – kann eio_event_loop() verwendet werden, die intern eio_poll() wiederholt aufruft, bis alle Requests abgearbeitet sind. eio_poll() selbst eignet sich jedoch besser für die Integration in bestehende Event-Systeme wie libevent, libev oder ReactPHP.

Da eio_poll() nicht blockiert, ist es sicher, sie innerhalb eines Non-Blocking-Frameworks aufzurufen. Die Funktion kehrt sofort zurück, wenn keine weiteren abgeschlossenen Requests vorliegen.

Rückgabewert

Typ
void
Beschreibung
Gibt keinen Wert zurück. Seiteneffekte bestehen im Ausführen der Callbacks aller seit dem letzten Aufruf fertiggestellten eio-Requests.

Beispiele

Einfacher Event-Loop mit eio_poll()

<?php
// eio-Erweiterung muss installiert und aktiviert sein

// Datei asynchron öffnen und lesen
eio_open('/etc/hostname', EIO_O_RDONLY, 0, EIO_PRI_DEFAULT, function ($data, $result) {
    if ($result !== -1) {
        eio_read($result, 64, 0, EIO_PRI_DEFAULT, function ($data, $content) use ($result) {
            echo "Hostname-Datei enthält: " . $content . PHP_EOL;
            eio_close($result);
        });
    } else {
        echo "Fehler beim Öffnen der Datei." . PHP_EOL;
    }
});

// Manueller Event-Loop: solange Requests ausstehen, poll aufrufen
while (eio_nreqs() > 0) {
    eio_poll();
}

echo "Alle Requests abgearbeitet." . PHP_EOL;
Hostname-Datei enthält: mein-server Alle Requests abgearbeitet.

Integration mit eio_get_event_stream() und stream_select()

<?php
// Notification-Stream abrufen (wird lesbar, wenn ein Request fertig ist)
$stream = eio_get_event_stream();

eio_stat('/tmp', EIO_PRI_DEFAULT, function ($data, $result) {
    if ($result !== -1) {
        echo "Verzeichnis /tmp existiert, Inode: " . $result['ino'] . PHP_EOL;
    }
});

// Stream-Select-basierter Mini-Event-Loop
while (eio_nreqs() > 0) {
    $read   = [$stream];
    $write  = null;
    $except = null;

    // Blockiert, bis der eio-Stream lesbar wird (max. 1 Sekunde)
    if (stream_select($read, $write, $except, 1) > 0) {
        // Notification lesen und ausstehende Requests verarbeiten
        eio_poll();
    }
}

echo "Fertig." . PHP_EOL;
Verzeichnis /tmp existiert, Inode: 123456 Fertig.

// Wichtig · Fallstricke

Voraussetzung: Die eio-PECL-Erweiterung muss installiert und in der php.ini aktiviert sein (extension=eio). Sie ist nicht Teil des PHP-Core.

Blocking-Verhalten: eio_poll() blockiert nicht. Soll das Skript auf den Abschluss aller Requests warten, muss eine Schleife verwendet werden (z. B. mit eio_nreqs() als Bedingung) oder eio_event_loop() eingesetzt werden.

Thread-Sicherheit: libeio nutzt intern Threads. PHP-Callbacks werden jedoch im Hauptthread ausgeführt, wenn eio_poll() aufgerufen wird – es besteht kein direkter Zugriff aus fremden Threads auf PHP-Ressourcen.