Start · Sprachen · PHP · Referenz · Swoole\Event

Swoole\Event

Klasse

Verwaltet Dateideskriptoren wie Client-, Process- oder Stream-Ressourcen im Ereignis-Loop von Swoole.

seit PHP 1.0.0 Kategorie: misc

Signatur

class Swoole\Event

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();
Empfangen: Hallo vom Ereignis-Loop!

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();
Pipe-Daten: Ergebnis aus dem Kindprozess

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