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