Start · Sprachen · PHP · Referenz · swoole_event_set

swoole_event_set

Funktion

Aktualisiert die Event-Callback-Funktionen und Flags eines bereits im Swoole-Event-Loop registrierten Sockets oder Dateideskriptors.

Kategorie: misc

Signatur

swoole_event_set(int $fd, callable|null $read_callback = null, callable|null $write_callback = null, int $flags = 0): bool

Beschreibung

swoole_event_set() ermöglicht es, die Callback-Funktionen eines bereits über swoole_event_add() registrierten Dateideskriptors nachträglich zu ändern. Damit lassen sich Lese- und/oder Schreib-Callbacks unabhängig voneinander aktualisieren, ohne den Deskriptor aus dem Event-Loop entfernen und neu hinzufügen zu müssen.

Typischerweise wird diese Funktion eingesetzt, wenn sich der Zustand einer Verbindung ändert: beispielsweise soll zunächst nur auf lesbare Daten gewartet werden, und erst wenn Daten zum Senden vorhanden sind, wird der Schreib-Callback aktiviert. Durch gezieltes Setzen von null als Callback und Anpassen der Flags lässt sich das Monitoring feingranular steuern.

Der Parameter $flags akzeptiert eine Kombination der Konstanten SWOOLE_EVENT_READ und SWOOLE_EVENT_WRITE, um zu definieren, auf welche Ereignisse der Deskriptor reagieren soll. Wird ein Flag weggelassen, wird das entsprechende Ereignis nicht mehr überwacht.

Diese Funktion gehört zur Swoole-Extension und steht nur zur Verfügung, wenn Swoole installiert und geladen ist. Sie ist Teil der Low-Level-Event-API und wird vor allem in eigenen Server-Implementierungen oder asynchronen Frameworks verwendet.

Parameter

Name Typ Default Beschreibung
$fd Pflicht int Dateideskriptor oder Socket-Ressource, der bereits mit swoole_event_add() im Event-Loop registriert wurde.
$read_callback callable|null null Callback-Funktion, die aufgerufen wird, wenn der Deskriptor lesbar ist. null deaktiviert den Lese-Callback.
$write_callback callable|null null Callback-Funktion, die aufgerufen wird, wenn der Deskriptor beschreibbar ist. null deaktiviert den Schreib-Callback.
$flags int 0 Bitmaske aus SWOOLE_EVENT_READ und/oder SWOOLE_EVENT_WRITE, die festlegt, welche Ereignisse überwacht werden sollen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Callbacks und Flags erfolgreich aktualisiert wurden, andernfalls false (z. B. wenn der Deskriptor nicht registriert ist).

Beispiele

Schreib-Callback nachträglich aktivieren

<?php
// Verbindung herstellen (nicht-blockierend)
$socket = stream_socket_client('tcp://127.0.0.1:9501', $errno, $errstr, 0, STREAM_CLIENT_ASYNC_CONNECT);
stream_set_blocking($socket, false);
$fd = (int) $socket;

// Zunächst nur auf Leseereignisse reagieren
swoole_event_add($fd, function ($fd) {
    echo "Daten empfangen: " . fread($fd, 8192) . PHP_EOL;
}, null, SWOOLE_EVENT_READ);

// Sobald Daten gesendet werden sollen, Schreib-Callback aktivieren
$dataToSend = "Hello Server!";
swoole_event_set($fd, null, function ($fd) use ($dataToSend) {
    fwrite($fd, $dataToSend);
    echo "Daten gesendet." . PHP_EOL;
    // Nach dem Senden Schreib-Callback deaktivieren
    swoole_event_set($fd, null, null, SWOOLE_EVENT_READ);
}, SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE);

swoole_event_wait();
Daten gesendet. Daten empfangen: ...

Lese-Callback austauschen

<?php
$socket = stream_socket_server('tcp://0.0.0.0:9502', $errno, $errstr);
stream_set_blocking($socket, false);
$fd = (int) $socket;

// Ersten Lese-Callback registrieren
swoole_event_add($fd, function ($fd) {
    echo "Erster Callback aufgerufen." . PHP_EOL;
}, null, SWOOLE_EVENT_READ);

// Callback gegen einen neuen austauschen
swoole_event_set($fd, function ($fd) {
    $conn = stream_socket_accept($fd);
    echo "Neue Verbindung akzeptiert." . PHP_EOL;
    fclose($conn);
}, null, SWOOLE_EVENT_READ);

swoole_event_wait();
Neue Verbindung akzeptiert.

// Wichtig · Fallstricke

Wichtig: swoole_event_set() funktioniert nur für Deskriptoren, die zuvor mit swoole_event_add() registriert wurden. Ein Aufruf mit einem nicht registrierten Deskriptor schlägt fehl und gibt false zurück.

Wenn $flags auf 0 gesetzt wird, ohne passende Callbacks anzugeben, wird der Deskriptor effektiv nicht mehr überwacht – dies entspricht jedoch nicht einem Entfernen aus dem Event-Loop. Verwenden Sie swoole_event_del(), um den Deskriptor vollständig zu entfernen.

Diese Funktion ist Teil der prozeduralen Swoole-API. In modernen Swoole-Versionen (ab 4.x) wird bevorzugt die objektorientierte API über Swoole\Event verwendet.