7.99 Socket
7 Index des fonctions
Manuel PHP
. Introduction . Pré-requis . Installation . Configuration à l'exécution . Types de ressources . Constantes prédefinies . Socket Errors . Exemples . socket_accept . socket_bind . socket_clear_error . socket_close . socket_connect . socket_create_listen . socket_create_pair . socket_create . socket_get_option . socket_getpeername . socket_getsockname . socket_iovec_add . socket_iovec_alloc . socket_iovec_delete . socket_iovec_fetch . socket_iovec_free . socket_iovec_set . socket_last_error . socket_listen . socket_read . socket_readv . socket_recv . socket_recvfrom . socket_recvmsg ->socket_select . socket_send . socket_sendmsg . socket_sendto . socket_set_block . socket_set_nonblock . socket_set_option . socket_shutdown . socket_strerror . socket_write . socket_writev
|
7.99.33 socket_select()
Exécute l'appel système select() un tableau de sockets
avec une durée d'expiration
[ Exemples avec socket_select ] PHP 4 >= 4.1.0
int
socket_select (
array
&read
,
array
&write
,
array
&except
,
int
tv_sec
,
int
tv_usec
)
Attention |
Cette fonction est
EXPERIMENTALE
. Cela signifie que le comportement de cette fonction, son nom et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
|
socket_select
accepte un tableau de sockets et
attend qu'elles changent de statut. Ceux qui sont familiers avec les
sockets de BSD reconnaitront dans ces tableaux de sockets les
sets de file descriptor. Trois tableaux indépendants de ressources
de sockets sont surveillés.
Les sockets listées dans le paramètre
read
seront surveillées en lecture : pour savoir quand elles sont
disponibles en lecture (plus précisément, si une lecture
ne va pas bloquer, en particulier, une ressource de socket a déjà
atteint une fin de fichier, auquel cas
socket_read
retournera une chaîne de taille zéro).
Les sockets listées dans
write
seront surveillées
en écriture : pour voir si une écriture ne va pas bloquer.
Les sockets listées dans
except
seront surveillées pour
leurs exceptions.
Attention |
En sortie de fonction, les tableaux sont modifiées pour indiquer
quelles sockets ont changés d'états.
|
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
.
Exemple avec socket_select |
<?php /* Prépare le tableau read (socket surveillées en lecture) */ $read = array($socket1, $socket2);
if (false === ($num_changed_sockets = socket_select($read, $write = NULL, $except = NULL, 0))) { /* Gestion des erreurs */ else if ($num_changed_sockets > 0) { /* Au moins une des sockets a été modifié */ } ?>
|
Note |
A cause d'une limitation du Zend Engine 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. A la place, utilisez
un tableau temporaire ou une expression dont le membre de gauche
est une variable temporaire :
Passer NULL à socket_select |
<?php socket_select($r, $w, $e = NULL, 0); ?>
|
|
Les paramètres
tv_sec
and
tv_usec
ensemble 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.
tv_sec
peut être zéro , ce qui fera que
socket_select
retournera immédiatement. C'est très
pratique pour faire du polling (sondage). Si
tv_sec
est
NULL
(pas de timeout),
socket_select
peut se bloquer indéfiniment.
En cas de succès,
socket_select
retourne le nombre de
sockets contenus dans les tableaux modifiées. 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
. Ce code d'erreur
peut être passé à la fonction
socket_strerror
pour obtenir un message d'erreur, humainement lisible.
Note |
Assurez vous bien d'utiliser l'opérateur
===
lorsque vous vérifiez les erreurs. Etant donnée que
socket_select
peut retourner 0, la comparaison
avec
FALSE
via
==
donnerait
TRUE
:
Analyser le résultat de socket_select |
<?php if (false === socket_select($r, $w, $e = NULL, 0)) { echo "socket_select() a échoué. Raison : " . socket_strerror(socket_last_error()) . "\n"; } ?>
|
|
Note |
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épends d'un
timeout est généralement peut portable, et difficile à déboguer.
-
Une socket ne doit pas être ajoutée à 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
, toutes les sockets dans tous les
tableaux doivent être vérifiées. Toute socket qui est disponible en
écriture ou en lecture doit être utilisée pour écrire ou lire.
-
Si vous écrivez ou lisez avec une socket retournée dans un tableau,
soyez conscient qu'elles ne pourront pas écrire ou lire toutes les données
que vous demandez. Soyez prêts à 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
est le cas des données hors limites,
reçues par une socket.
|
Voir aussi
socket_read
,
socket_write
,
socket_last_error
et
socket_strerror
.
|