Signatur
Beschreibung
eio_get_event_stream() gibt eine Stream-Ressource zurück, die von libeio intern genutzt wird, um abgeschlossene asynchrone I/O-Ereignisse zu signalisieren. Der Stream kann in externe Event-Schleifen (z. B. stream_select(), libevent, libev) eingebunden werden, um nicht-blockierendes Warten auf fertige eio-Operationen zu ermöglichen.
Typischerweise wird der zurückgegebene Stream als lesbare Ressource in einem select()- oder Event-Loop-Aufruf registriert. Sobald der Stream lesbar ist, zeigt das an, dass mindestens eine eio-Aufgabe abgeschlossen wurde und eio_poll() aufgerufen werden sollte, um die entsprechenden Callbacks auszuführen.
Diese Funktion ist besonders nützlich, wenn PHP-Anwendungen auf eine bereits vorhandene Event-Loop aufsetzen (z. B. mit der event- oder libevent-Extension), da sie das Polling nicht über aktives Warten, sondern reaktiv über Dateisystem-Events koordinieren können.
Ohne Integration in eine Event-Loop würde man typischerweise eio_poll() manuell und blockierend in einer Schleife aufrufen – was weniger effizient ist. Mit eio_get_event_stream() lässt sich die CPU-Auslastung deutlich reduzieren.
Rückgabewert
stream_select() oder anderen Event-Mechanismen überwacht werden.Beispiele
Integration mit stream_select() für reaktives eio-Polling
<?php
// Asynchrone Datei-Lese-Operation starten
eio_read(
fopen('/etc/hostname', 'r'),
256,
0,
EIO_PRI_DEFAULT,
function ($data, $result) {
echo "Gelesen: " . $result . PHP_EOL;
}
);
// Event-Stream holen
$eventStream = eio_get_event_stream();
// Reaktive Polling-Schleife
while (eio_nreqs() > 0) {
$read = [$eventStream];
$write = [];
$except = [];
// Warte blockierend, bis der Stream lesbar ist (= eine eio-Aufgabe fertig)
if (stream_select($read, $write, $except, 1)) {
// Callbacks der fertigen Operationen ausführen
eio_poll();
}
}
?>
Verwendung mit der event-Extension für eine vollständige Event-Loop
<?php
// Setzt voraus, dass die PECL-Extension "event" installiert ist
$base = new EventBase();
// Asynchrone Datei-Statistik starten
eio_stat('/tmp', EIO_PRI_DEFAULT, function ($data, $result) use ($base) {
echo "Dateigröße: " . $result['size'] . PHP_EOL;
$base->stop();
});
// libeio Event-Stream in die Event-Loop einbinden
$eventStream = eio_get_event_stream();
$event = new Event($base, $eventStream, Event::READ | Event::PERSIST, function () {
eio_poll();
});
$event->add();
// Event-Loop starten
$base->dispatch();
?>
// Wichtig · Fallstricke
Hinweis: eio_get_event_stream() setzt voraus, dass die PECL-Extension eio installiert und aktiviert ist. Sie ist nicht Teil des PHP-Kerns.
Wichtig: Der zurückgegebene Stream darf nicht direkt gelesen oder beschrieben werden – er dient ausschließlich zur Signalisierung. Jede direkte Nutzung über fread() o. Ä. kann zu unerwartetem Verhalten führen.
Nach dem Empfang eines Signals auf dem Stream muss zwingend eio_poll() aufgerufen werden, um die internen Callbacks zu verarbeiten. Andernfalls bleiben abgeschlossene Operationen ohne Rückmeldung.