|
|
socket_select
Führt einen select()-Systemaufruf auf den gegebenen Socket-Arrays aus, wobei ein Zeitlimit bestimmt wird
Beschreibung
int socket_select
( array &$read
, array &$write
, array &$except
, int $tv_sec
[, int $tv_usec = 0
] )
Parameter-Liste
-
read
-
Die Sockets, die im read-Array aufgelistet sind,
werden daraufhin überwacht, ob Zeichen zum Auslesen zur Verfügung
gestellt werden. (Um genauer zu sein: es wird überwacht, ob ein
Lesevorgang blockiert - ein Socket ist nämlich auch dann bereit, wenn er
bis zum Dateiende gelesen hat. In diesem Fall gibt
socket_read einen leeren String zurück.)
-
write
-
Die Sockets, die im write-Array aufgelistet
sind, werden daraufhin überwacht, ob ein Schreibvorgang blockiert.
-
except
-
Die Sockets, die im except-Array aufgelistet
sind, werden auf Ausnahmen überwacht.
-
tv_sec
-
tv_sec und tv_usec
bilden zusammen den timeout-Parameter. Der
timeout ist eine obere Schranke für die Zeit, die
verstreichen kann, bis socket_select zurückkehrt.
tv_sec kann 0 sein, wodurch
socket_select sofort zurückkehrt. Dies ist
nützlich beim Polling. Falls der Parameter tv_sec
NULL ist (kein Timeout), kann socket_select
unendlich lange blockieren.
-
tv_usec
-
Warnung
Beim Beenden werden alle Arrays aktualisiert, und zeigen an, welche
Sockets ihren Status geändert haben.
Sie brauchen nicht jedes Array einzeln an socket_select
übergeben. Sie können die Arrays auch weglassen und stattdessen leere
Arrays oder NULL angeben. Vergessen Sie nicht, dass diese Arrays
by reference übergeben werden müssen und dass sie
verändert werden, nachdem die Funktion socket_select
beendet ist.
Hinweis:
Wegen einer Einschränkung in der aktuellen Zend Engine ist es nicht möglich,
eine Konstante, wie etwa NULL, direkt als Parameter an Funktionen zu
übergeben, die ihre Argumente als Referenzen erwarten. Sie können
stattdessen eine temporäre Variable oder einen Ausdruck, in dem der am
weitesten links stehende Teilausdruck eine temporäre Variable ist, benutzen.
Beispiel #1 NULL mit socket_select benutzen:
<?php $e = NULL; socket_select($r, $w, $e, 0); ?>
Rückgabewerte
Bei Erfolg gibt socket_select die Anzahl der
Socket-Deskriptoren zurück, die in den aktualisierten Arrays enthalten sind.
Falls der Timeout wirksam wird, bevor irgend etwas Interessantes passiert,
ist das Funktionsergebnis 0. Falls ein Fehler auftritt, wird FALSE
zurückgegeben. Der Fehlercode kann dann mit
socket_last_error abgefragt werden.
Hinweis:
Wenn Sie einen Fehler aufspüren wollen, müssen Sie unbedingt den
Operator === benutzen. Weil
socket_select auch 0 zurückgeben kann, wird der
Vergleich mit == sonst zu TRUE ausgewertet.
Beispiel #2 Rückgaben von socket_select verstehen
<?php $e = NULL; if (false === socket_select($r, $w, $e, 0)) { echo "socket_select() fehlgeschlagen, Grund: " . socket_strerror(socket_last_error()) . "\n"; } ?>
Beispiele
Beispiel #3 socket_select-Beispiel
<?php /* Das Array read vorbereiten */ $read = array($socket1, $socket2); $write = NULL; $except = NULL; $num_changed_sockets = socket_select($read, $write, $except, 0);
if ($num_changed_sockets === false) { /* Fehlerbehandlung */ } else if ($num_changed_sockets > 0) { /* Mindestens an einem Socket ist etwas Interessantes passiert */ } ?>
Anmerkungen
Hinweis:
Seien Sie sich bewusst, dass manche Socket-Implementierungen sehr
sorgfältig benutzt werden müssen. Ein paar grundsätzliche Regeln:
-
Sie sollten immer versuchen, socket_select ohne
Timeout zu benutzen. Ihr Programm sollte nichts tun, wenn keine Daten
verfügbar sind. Code, der von Zeitbegrenzungen abhängig ist, ist
normalerweise nicht portierbar und schwierig zu debuggen.
-
Es sollte kein Socket-Deskriptor in die Arrays eingefügt werden, wenn
Sie nicht vorhaben, die Ergebnisse nach der Ausführung von
socket_select zu prüfen und entsprechend darauf zu
reagieren. Nachdem socket_select beendet ist, müssen
alle Sockets in allen Socket-Arrays geprüft werden. Jeder Socket, der
zum Schreiben zur Verfügung steht, muss beschrieben werden und aus jedem
Socket, der zum Lesen verfügbar ist, muss gelesen werden.
-
Bei Schreib-/Leseoperationen auf den Sockets in den Arrays müssen Sie
damit rechnen, dass nicht notwendigerweise alle Daten geschrieben/gelesen
werden, die Sie angeben. Seien Sie darauf vorbereitet, dass Sie
möglicherweise nur ein einziges Byte schreiben/lesen können.
-
Fast allen Socket-Implementierungen ist gemeinsam, dass sie nur eine
einzige Ausnahme in dem Array
except auffangen
können. Und zwar, wenn bandexterne Daten von einem Socket empfangen
werden.
Siehe auch
- socket_read
- socket_write
- socket_last_error
- socket_strerror
|