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