Signatur
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
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();
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();
// 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.