socket_select
Exécute l'appel système select() sur un tableau de sockets avec une durée d'expiration
&reftitle.description;
intfalsesocket_select
arraynullread
arraynullwrite
arraynullexcept
intnullseconds
intmicroseconds0
socket_select accepte un tableau de sockets et
attend qu'elles changent de statut. Ceux qui sont familiers avec les
sockets de BSD reconnaîtront dans ces tableaux de sockets les
jeux de pointeurs de fichiers. Trois tableaux indépendants
de sockets sont surveillés.
&reftitle.parameters;
read
Les sockets listés dans le paramètre read
seront surveillés en lecture : pour savoir quand ils sont
disponibles en lecture (plus précisément, si une lecture
ne va pas bloquer, en particulier, un socket a déjà
atteint une fin de fichier, auquel cas socket_read
retournera une chaîne de taille zéro).
write
Les sockets listés dans write seront surveillés
en écriture : pour voir si une écriture ne va pas bloquer.
except
Les sockets listés dans except seront surveillés pour
leurs exceptions.
seconds
Les paramètres seconds et microseconds
ensembles forment le paramètre timeout (durée de vie).
Le timeout est la durée maximale de temps avant que
socket_select ne se termine.
seconds peut être zéro, ce qui fera que
socket_select retournera immédiatement. C'est très
pratique pour faire du polling (sondage). Si seconds est &null;
(pas de timeout), socket_select peut se bloquer indéfiniment.
microseconds
En sortie de fonction, les tableaux sont modifiées pour indiquer
quels sockets ont changé d'état.
Vous n'avez pas besoin de passer tous les tableaux à
socket_select. Vous pouvez les omettre, ou
utiliser un tableau vide, ou encore &null; à la place. N'oubliez pas
que ces tableaux sont passés par référence et
seront modifiés par socket_select.
À cause d'une limitation du moteur Zend actuel, il n'est pas possible
de passer une constante comme &null; directement comme paramètre à cette
fonction, qui attend une valeur par référence. À la place, utilisez
un tableau temporaire ou une expression dont le membre de gauche
est une variable temporaire :
Passer &null; à socket_select
]]>
&reftitle.returnvalues;
En cas de succès, socket_select retourne le nombre de
sockets contenues dans les tableaux modifiés. Ce nombre peut être zéro si
la durée maximale d'attente a été atteinte. En cas d'erreur, &false;
est retourné. Le code d'erreur généré peut être obtenu en appelant la
fonction socket_last_error.
Assurez-vous bien d'utiliser l'opérateur ===
lorsque vous vérifiez les erreurs. Étant donnée que
socket_select peut retourner 0, la comparaison
avec &false; via == donnerait &true; :
Analyser le résultat de socket_select
]]>
&reftitle.examples;
Exemple avec socket_select
0) {
/* Au moins une des sockets a été modifiée */
}
?>
]]>
&reftitle.notes;
Méfiez-vous des implémentations de sockets, qui doivent être manipulées avec
délicatesse. Quelques règles de base :
Vous devez toujours essayer d'utiliser socket_select
sans timeout. Votre programme ne devrait avoir rien à faire si
il n'y a pas de données disponibles. Le code qui dépend d'un
timeout est généralement peu portable, et difficile à déboguer.
Un socket ne doit pas être ajouté à l'un des tableaux en paramètre,
si vous ne souhaitez pas vérifier le résultat après l'appel à
socket_select. Après le retour de
socket_select, tous les sockets dans tous les
tableaux doivent être vérifiés. Tout socket qui est disponible en
écriture ou en lecture doit être utilisé pour écrire ou lire.
Si vous écrivez ou lisez avec un socket retourné dans un tableau,
soyez conscient qu'il ne pourra pas écrire ou lire toutes les données
que vous demandez. Soyez prêt à ne pouvoir lire qu'un seul octet.
Il est commun à la plupart des implémentations de socket que la seule
exception interceptée par les sockets dans le tableau
except soit le cas des données hors limites,
reçues par un socket.
&reftitle.seealso;
socket_read
socket_write
socket_last_error
socket_strerror