Start · Sprachen · PHP · Referenz · swoole_event_add

swoole_event_add

Funktion

Fügt einen Dateideskriptor oder Socket zur Swoole-Event-Loop hinzu und registriert Callback-Funktionen für Lese- und/oder Schreibereignisse.

seit PHP 1.6.0 Kategorie: misc

Signatur

swoole_event_add(mixed $fd, callable|null $read_callback = null, callable|null $write_callback = null, int $events = 0): bool

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

Typ
bool
Beschreibung
Gibt 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();
Empfangen: Hallo Swoole Event Loop!

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();
Antwort erhalten (... Bytes)

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