Start · Sprachen · PHP · Referenz · swoole_event_del

swoole_event_del

Funktion

Entfernt alle registrierten Event-Callback-Funktionen eines Sockets aus dem Swoole-Event-Loop.

Kategorie: misc

Signatur

swoole_event_del(mixed $fd): bool

Beschreibung

swoole_event_del entfernt einen zuvor mit swoole_event_add registrierten Socket oder Dateideskriptor vollständig aus dem Swoole-Event-Loop. Alle für diesen Deskriptor registrierten Callback-Funktionen (Lesen, Schreiben, Fehler) werden dabei aufgehoben.

Die Funktion ist besonders nützlich, wenn eine Verbindung geschlossen oder nicht mehr überwacht werden soll, ohne den gesamten Event-Loop zu beenden. Sie entspricht dem Entfernen eines Fds aus einem epoll- oder kqueue-Watchlist.

Typischer Anwendungsfall ist die saubere Bereinigung von Ressourcen innerhalb asynchroner Server- oder Client-Anwendungen, die auf dem Swoole-Framework basieren. Nach dem Entfernen sollte der Deskriptor üblicherweise auch mit fclose() oder dem entsprechenden Socket-Close-Befehl geschlossen werden.

Hinweis: Diese Funktion steht nur zur Verfügung, wenn die Swoole-Erweiterung installiert und aktiv ist. Sie ist nicht Bestandteil des PHP-Kerns.

Parameter

Name Typ Default Beschreibung
$fd Pflicht mixed Der Socket, Stream oder Dateideskriptor, dessen Event-Callbacks aus dem Event-Loop entfernt werden sollen. Kann ein PHP-Stream-Resource, ein Socket-Resource oder ein Integer-Dateideskriptor sein.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Deskriptor erfolgreich aus dem Event-Loop entfernt wurde. Gibt false zurück, wenn der Deskriptor nicht im Event-Loop registriert war oder ein Fehler aufgetreten ist.

Beispiele

Socket aus dem Event-Loop entfernen

<?php
// Socket erstellen und zum Event-Loop hinzufügen
$socket = stream_socket_client('tcp://127.0.0.1:9501', $errno, $errstr, 30);
stream_set_blocking($socket, false);

swoole_event_add($socket, function ($socket) {
    $data = fread($socket, 8192);
    if ($data === '' || $data === false) {
        echo "Verbindung geschlossen, entferne Socket aus Event-Loop." . PHP_EOL;
        // Socket aus dem Event-Loop entfernen
        swoole_event_del($socket);
        fclose($socket);
        return;
    }
    echo "Empfangene Daten: " . $data . PHP_EOL;
});

swoole_event_wait();

Temporäres Überwachen eines Dateideskriptors

<?php
// Pipe erstellen
[$read, $write] = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
stream_set_blocking($read, false);
stream_set_blocking($write, false);

$counter = 0;

swoole_event_add($read, function ($read) use ($write, &$counter) {
    $data = fread($read, 64);
    echo "Empfangen: " . trim($data) . PHP_EOL;
    $counter++;

    // Nach 3 Nachrichten den Deskriptor aus dem Event-Loop entfernen
    if ($counter >= 3) {
        echo "Limit erreicht, entferne Deskriptor." . PHP_EOL;
        swoole_event_del($read);
        fclose($read);
        fclose($write);
    }
});

// Daten in die Pipe schreiben
for ($i = 1; $i <= 3; $i++) {
    swoole_event_write($write, "Nachricht $i\n");
}

swoole_event_wait();
Empfangen: Nachricht 1 Empfangen: Nachricht 2 Empfangen: Nachricht 3 Limit erreicht, entferne Deskriptor.

// Wichtig · Fallstricke

Swoole-Erweiterung erforderlich: Diese Funktion ist nur verfügbar, wenn die Swoole PHP-Erweiterung installiert ist. Sie ist kein Bestandteil des PHP-Standardlieferumfangs.

Reihenfolge beachten: Nach dem Aufruf von swoole_event_del sollte der Deskriptor nicht mehr für Event-Operationen verwendet werden. Ein anschließendes fclose() ist empfehlenswert, um Ressourcen freizugeben und Dateideskriptor-Lecks zu vermeiden.

Nicht innerhalb des Callbacks doppelt entfernen: Es sollte sichergestellt werden, dass swoole_event_del für einen bestimmten Deskriptor nur einmal aufgerufen wird, da ein mehrfacher Aufruf zu undefinierten Zuständen oder Fehlern führen kann.