Start · Sprachen · PHP · Referenz · swoole_client_select

swoole_client_select

Funktion

Überwacht mehrere <code>Swoole\Client</code>-Instanzen gleichzeitig und gibt zurück, wie viele Dateideskriptoren lese-, schreibbereit oder fehlerhaft sind.

Kategorie: misc

Signatur

swoole_client_select(array &$read, array &$write, array &$error, float $timeout = 0.5): int|false

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: lese­bereit, schreib­bereit 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

Typ
int|false
Beschreibung
Gibt die Anzahl der bereiten Dateideskriptoren (Summe aus allen drei Arrays) zurück. Gibt 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";
    }
}
2 Client(s) bereit: Antwort empfangen (... Bytes) Antwort empfangen (... Bytes)

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";
}
Noch keine Daten verfügbar.

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