Signatur
Beschreibung
Swoole\Event ist eine statische Klasse, die eine direkte Schnittstelle zum internen Ereignis-Loop von Swoole bereitstellt. Sie ermöglicht es, beliebige Dateideskriptoren – beispielsweise TCP-Sockets, Unix-Sockets, Prozess-Pipes oder PHP-Stream-Ressourcen – in den Ereignis-Loop einzubinden und bei Lese-, Schreib- oder Fehlerereignissen Callbacks auszulösen.
Die Klasse ist besonders nützlich, wenn man außerhalb des Standard-Swoole-Servers eigene I/O-Ressourcen asynchron überwachen möchte, ohne blockierende read()- oder select()-Aufrufe zu verwenden. Typische Anwendungsfälle sind das Überwachen externer Prozess-Pipes, das Integrieren von POSIX-Signalen oder das Einbinden von Drittanbieter-Sockets in eine Swoole-Anwendung.
Die Methoden der Klasse sind allesamt statisch (Swoole\Event::add(), Swoole\Event::set(), Swoole\Event::del(), Swoole\Event::wait() usw.) und wirken direkt auf den globalen Ereignis-Loop. Das Hinzufügen von Deskriptoren ist daher von überall im Code möglich, solange der Loop noch läuft.
Wichtig: Swoole\Event ist ausschließlich im Kontext von Swoole (Coroutine- oder Server-Umgebung) sinnvoll. Im klassischen synchronen PHP-CLI-Skript muss der Loop am Ende explizit mit Swoole\Event::wait() gestartet werden, damit die registrierten Callbacks ausgeführt werden.
Beispiele
Dateideskriptor (Socket) zum Ereignis-Loop hinzufügen
<?php
// Erstellt ein nicht-blockierendes Socket-Paar und überwacht es im Ereignis-Loop
[$read, $write] = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
stream_set_blocking($read, false);
stream_set_blocking($write, false);
// Schreibseite: Daten senden
Swoole\Event::add($write, null, function ($fd) {
fwrite($fd, "Hallo vom Ereignis-Loop!");
Swoole\Event::del($fd);
}, SWOOLE_EVENT_WRITE);
// Leseseite: Daten empfangen
Swoole\Event::add($read, function ($fd) {
$data = fread($fd, 1024);
echo "Empfangen: " . $data . PHP_EOL;
Swoole\Event::del($fd);
}, null, SWOOLE_EVENT_READ);
// Loop starten (blockiert bis alle Deskriptoren entfernt wurden)
Swoole\Event::wait();
Prozess-Pipe asynchron überwachen
<?php
// Überwacht die Ausgabe eines Kindprozesses asynchron
$process = new Swoole\Process(function (Swoole\Process $proc) {
sleep(1);
$proc->write("Ergebnis aus dem Kindprozess");
});
$process->start();
$pipe = $process->exportSocket();
Swoole\Event::add($pipe, function ($socket) use ($process) {
$data = $socket->recv();
echo "Pipe-Daten: " . $data . PHP_EOL;
Swoole\Event::del($socket);
Swoole\Process::wait();
});
Swoole\Event::wait();
// Wichtig · Fallstricke
Verfügbare statische Methoden:
Swoole\Event::add($fd, callable $readCallback, callable $writeCallback, int $flags)– Fügt einen Dateideskriptor zum Loop hinzu.Swoole\Event::set($fd, callable $readCallback, callable $writeCallback, int $flags)– Aktualisiert Callbacks oder Flags eines bereits registrierten Deskriptors.Swoole\Event::del($fd)– Entfernt einen Deskriptor aus dem Loop.Swoole\Event::wait()– Startet den Ereignis-Loop (blockierend) und kehrt erst zurück, wenn keine Deskriptoren mehr registriert sind.Swoole\Event::exit()– Beendet den Ereignis-Loop sofort.Swoole\Event::defer(callable $callback)– Führt einen Callback am Ende des aktuellen Loop-Durchlaufs aus.
Achtung: Das Mischen von blockierenden I/O-Operationen (z. B. normales fread() auf einem blockierenden Stream) mit dem Swoole-Ereignis-Loop führt zu unvorhersehbarem Verhalten und sollte unbedingt vermieden werden. Alle eingebundenen Streams müssen als non-blocking konfiguriert sein.
Die Klasse steht nur zur Verfügung, wenn die Swoole-Erweiterung installiert und aktiviert ist. Sie ist nicht mit dem ReactPHP- oder Amp-Ereignis-Loop kompatibel.