Start · Sprachen · PHP · Referenz · eio_get_event_stream

eio_get_event_stream

Funktion

Liefert einen Stream-Ressource zur internen Kommunikation mit libeio, der in Event-Loops integriert werden kann.

seit PHP 0.3.1b Kategorie: io

Signatur

eio_get_event_stream(): resource

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

Typ
resource
Beschreibung
Gibt eine Stream-Ressource zurück, die intern von libeio zur Signalisierung von Ereignissen verwendet wird. Diese Ressource kann mit 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();
    }
}
?>
Gelesen: mein-hostname

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();
?>
Dateigröße: 4096

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