Signatur
Beschreibung
swoole_client_select ist das Swoole-Äquivalent zur POSIX-Funktion select(). Sie nimmt drei Arrays von Swoole\Client-Objekten entgegen und prüft, welche davon innerhalb des angegebenen Timeouts einen bestimmten Zustand erreichen: lesebereit, schreibbereit oder fehlerhaft. Alle nicht-aktiven Einträge werden aus den Arrays entfernt – nach dem Aufruf enthalten die Arrays nur noch die Clients, auf die die jeweilige Bedingung zutrifft.
Die Funktion eignet sich besonders für synchrone (blockierende) Swoole-Clients in einem nicht-korroutinenbasierten Kontext. Mit ihr lassen sich mehrere TCP/UDP-Verbindungen in einer einzigen Ereignisschleife überwachen, ohne für jeden Client einen eigenen Prozess oder Thread zu benötigen.
Im Unterschied zu Swooles asynchronem Event-Loop ist swoole_client_select blockierend bis zum Ablauf des Timeouts oder bis mindestens ein Deskriptor bereit ist. Das Muster ist damit vergleichbar mit klassischem I/O-Multiplexing per socket_select, jedoch auf Swoole-Client-Objekte zugeschnitten.
Zu beachten ist, dass diese Funktion in einem Coroutine-Kontext nicht empfohlen wird; dort sollten stattdessen Coroutine-Clients mit Co\Client und Coroutine::select verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $read Pflicht | array | Array von Swoole\Client-Instanzen, die auf Lesbarkeit geprüft werden sollen. Nach dem Aufruf enthält das Array nur noch die lesbereiten Clients. |
|
| $write Pflicht | array | Array von Swoole\Client-Instanzen, die auf Schreibbereitschaft geprüft werden sollen. Nach dem Aufruf enthält das Array nur noch die schreibbereiten Clients. |
|
| $error Pflicht | array | Array von Swoole\Client-Instanzen, die auf Fehler geprüft werden sollen. Nach dem Aufruf enthält das Array nur noch die Clients mit einem Fehler. |
|
| $timeout | float | 0.5 | Maximale Wartezeit in Sekunden. 0 bedeutet nicht-blockierend (sofortige Rückkehr), negative Werte oder sehr große Werte bewirken eine quasi-unbegrenzte Blockierung. |
Rückgabewert
0 zurück, wenn der Timeout abgelaufen ist, ohne dass ein Deskriptor bereit war. Im Fehlerfall wird false zurückgegeben.Beispiele
Mehrere TCP-Clients gleichzeitig überwachen
<?php
// Zwei synchrone Swoole-Clients erstellen und verbinden
$client1 = new Swoole\Client(SWOOLE_SOCK_TCP);
$client1->connect('httpbin.org', 80);
$client1->send("GET /get HTTP/1.0\r\nHost: httpbin.org\r\n\r\n");
$client2 = new Swoole\Client(SWOOLE_SOCK_TCP);
$client2->connect('httpbin.org', 80);
$client2->send("GET /ip HTTP/1.0\r\nHost: httpbin.org\r\n\r\n");
// Arrays für select() vorbereiten
$read = [$client1, $client2];
$write = [];
$error = [$client1, $client2];
// Bis zu 2 Sekunden warten
$n = swoole_client_select($read, $write, $error, 2.0);
if ($n === false) {
echo "Fehler bei swoole_client_select\n";
} elseif ($n === 0) {
echo "Timeout: kein Client bereit\n";
} else {
echo "$n Client(s) bereit:\n";
foreach ($read as $client) {
$data = $client->recv();
echo "Antwort empfangen (" . strlen($data) . " Bytes)\n";
}
foreach ($error as $client) {
echo "Fehler auf einem Client\n";
}
}
Nicht-blockierender Aufruf (Timeout = 0)
<?php
// Client verbinden und Anfrage senden
$client = new Swoole\Client(SWOOLE_SOCK_TCP);
$client->connect('example.com', 80);
$client->send("GET / HTTP/1.0\r\nHost: example.com\r\n\r\n");
$read = [$client];
$write = [];
$error = [];
// Sofortiger Check – nicht blockierend
$n = swoole_client_select($read, $write, $error, 0);
if ($n > 0) {
echo "Daten sofort verfügbar: " . $client->recv() . "\n";
} else {
echo "Noch keine Daten verfügbar.\n";
}
// Wichtig · Fallstricke
Coroutine-Kontext: swoole_client_select blockiert den gesamten Worker-Prozess und sollte daher nicht innerhalb von Coroutinen verwendet werden. In Coroutine-Umgebungen sind Co\Client und Coroutine::select die richtige Wahl.
Limitierung: Unter Linux unterliegt die zugrundeliegende select()-Implementierung dem Limit von 1024 gleichzeitigen Dateideskriptoren (FD_SETSIZE). Für größere Verbindungszahlen ist der Swoole-Event-Loop oder die Verwendung von epoll vorzuziehen.
Array-Mutation: Die übergebenen Arrays werden von der Funktion direkt modifiziert (by reference). Nach dem Aufruf enthalten sie nur noch die bereiten Clients – die ursprüngliche Liste sollte daher vor dem Aufruf separat gesichert werden, wenn sie weiterhin benötigt wird.