Signatur
Beschreibung
swoole_event_add() ist Teil der Swoole-Erweiterung und ermöglicht es, einen Socket, eine Pipe oder einen anderen Dateideskriptor in die interne Event-Loop von Swoole einzutragen. Sobald das Objekt registriert ist, ruft die Event-Loop automatisch die angegebenen Callbacks auf, wenn Daten zum Lesen bereitstehen oder der Puffer für das Schreiben frei ist.
Diese Funktion eignet sich besonders für nicht-blockierende I/O-Szenarien außerhalb eines Swoole-Servers, etwa in eigenständigen asynchronen Programmen oder bei der Integration externer Sockets in eine bestehende Swoole-Applikation. Der Parameter $events erlaubt die Angabe der gewünschten Ereignistypen über die Konstanten SWOOLE_EVENT_READ und SWOOLE_EVENT_WRITE.
Die Callbacks werden mit dem Dateideskriptor als erstem Argument aufgerufen, sodass innerhalb des Callbacks gezielt auf das auslösende Socket reagiert werden kann. Die Event-Loop läuft, bis sie explizit beendet wird oder keine überwachten Deskriptoren mehr vorhanden sind.
Hinweis: Diese Funktion steht nur zur Verfügung, wenn die Swoole-PHP-Erweiterung installiert und aktiv ist. Sie ist nicht Teil der Standard-PHP-Bibliothek.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $fd Pflicht | mixed | Ein Socket-Ressource, ein Stream oder ein ganzzahliger Dateideskriptor, der zur Event-Loop hinzugefügt werden soll. | |
| $read_callback | callable|null | null | Callback-Funktion, die aufgerufen wird, wenn Daten auf dem Deskriptor zum Lesen bereitstehen. Erhält den Dateideskriptor $fd als Parameter. |
| $write_callback | callable|null | null | Callback-Funktion, die aufgerufen wird, wenn der Schreibpuffer des Deskriptors frei ist. Erhält den Dateideskriptor $fd als Parameter. |
| $events | int | 0 | Bitmaske der zu überwachenden Ereignistypen. Mögliche Werte: SWOOLE_EVENT_READ, SWOOLE_EVENT_WRITE oder eine Kombination beider mit |. |
Rückgabewert
true zurück, wenn der Dateideskriptor erfolgreich zur Event-Loop hinzugefügt wurde. Bei einem Fehler (z. B. ungültiger Deskriptor oder bereits registrierter Deskriptor) wird false zurückgegeben.Beispiele
Nicht-blockierendes Lesen von einem Socket mit swoole_event_add
<?php
// Erstellt ein TCP-Socket-Paar für die Demonstration
[$read, $write] = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
stream_set_blocking($read, false);
stream_set_blocking($write, false);
// Fügt das Lese-Ende zur Event-Loop hinzu
swoole_event_add($read, function ($fd) use ($write) {
$data = fread($fd, 1024);
echo "Empfangen: " . $data . PHP_EOL;
// Socket aus der Event-Loop entfernen und schließen
swoole_event_del($fd);
fclose($fd);
});
// Schreibt Daten in das Schreib-Ende, was den Lese-Callback auslöst
swoole_event_add($write, null, function ($fd) {
fwrite($fd, "Hallo Swoole Event Loop!");
swoole_event_del($fd);
fclose($fd);
}, SWOOLE_EVENT_WRITE);
// Event-Loop starten
swoole_event_wait();
Asynchrones Überwachen eines Netzwerk-Sockets
<?php
// Verbindet sich asynchron zu einem Server
$socket = stream_socket_client('tcp://example.com:80', $errno, $errstr, 0, STREAM_CLIENT_ASYNC_CONNECT);
stream_set_blocking($socket, false);
$request = "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n";
// Schreib-Callback: Sendet die Anfrage, sobald die Verbindung bereit ist
swoole_event_add($socket,
// Lese-Callback
function ($fd) {
$response = fread($fd, 8192);
echo "Antwort erhalten (" . strlen($response) . " Bytes)" . PHP_EOL;
swoole_event_del($fd);
fclose($fd);
},
// Schreib-Callback
function ($fd) use ($request) {
fwrite($fd, $request);
// Schreib-Ereignis nach dem Senden deaktivieren
swoole_event_set($fd, null, null, SWOOLE_EVENT_READ);
},
SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE
);
swoole_event_wait();
// Wichtig · Fallstricke
Nur mit Swoole-Erweiterung: Diese Funktion ist ausschließlich verfügbar, wenn die swoole-Erweiterung in PHP installiert und geladen ist. Sie ist kein Bestandteil von Standard-PHP.
Nicht-blockierende Deskriptoren: Der übergebene Socket oder Stream sollte auf nicht-blockierenden Modus gesetzt sein (z. B. mit stream_set_blocking($fd, false)), da sonst der Vorteil der asynchronen Verarbeitung verloren geht und die Event-Loop blockiert werden kann.
Doppelte Registrierung: Wird derselbe Dateideskriptor zweimal mit swoole_event_add() hinzugefügt, schlägt der zweite Aufruf fehl. Verwende stattdessen swoole_event_set(), um die Callbacks eines bereits registrierten Deskriptors zu ändern.
Ressourcenverwaltung: Nicht mehr benötigte Deskriptoren sollten mit swoole_event_del() aus der Event-Loop entfernt und anschließend mit fclose() geschlossen werden, um Ressourcenlecks zu vermeiden.