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