socket_recvfrom
socket_send
Fonctions sur les sockets
PHP Manual

# socket_select

(PHP 4 >= 4.1.0, PHP 5)

socket_select — Exécute l'appel système select() un tableau de sockets avec une durée d'expiration

### Description

int socket_select ( array `&$read` , array `&$write` , array `&$except` , int `$tv_sec` [, int `$tv_usec` = 0 ] )

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 ressources de sockets sont surveillés.

### Liste de paramètres

`read`

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

`write`

  Les sockets listées dans `write` seront surveillées en écriture : pour voir si une écriture ne va pas bloquer.

`except`

  Les sockets listées dans `except` seront surveillées pour leurs exceptions.

`tv_sec`

  Les paramètres `tv_sec` et `tv_usec` 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. `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.

`tv_usec`

Avertissement

En sortie de fonction, les tableaux sont modifiées pour indiquer quelles 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().

> Note: À 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 :

> Exemple #1 Passer `NULL` à socket_select()

> `<?php
> $e = NULL;
> socket_select($r, $w, $e, 0);
> ?>`

### Valeurs de retour

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().

> Note: 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` :

> Exemple #2 Analyser le résultat de socket_select()

> `<?php
> $e = NULL;
> if (false === socket_select($r, $w, $e, 0)) {
> echo "socket_select() a échoué. Raison : " .
> socket_strerror(socket_last_error()) . "\n";
> }
> ?>`

### Exemples

Exemple #3 Exemple avec socket_select()

`<?php
/* Prépare le tableau read (socket surveillées en lecture) */
$read = array($socket1, $socket2);
$write = NULL;
$except = NULL;
$num_changed_sockets = socket_select($read, $write, $except, 0);
if ($num_changed_sockets === false) {
/* Gestion des erreurs */
} else if ($num_changed_sockets > 0) {
/* Au moins une des sockets a été modifiée */
}
?>`

### Notes

> 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épend d'un timeout est généralement peu 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'elle 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 une socket.

### Voir aussi

- socket_read() - Lit des données d'une socket
- socket_write() - Écrit dans une socket
- socket_last_error() - Lit la dernière erreur générée par une socket
- socket_strerror() - Retourne une chaîne décrivant un message d'erreur

socket_recvfrom
socket_send
Fonctions sur les sockets
PHP Manual