Services webmasters
Partenaires
Jeux concours gratuits
 
socket_recvmsg
<<<
socket_select socket_send
>>>

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 .

<< socket_select >>
socket_recvmsg Socket socket_send
Services webmasters
Les manuels
 
CoursPHP.com - Reproduction interdite -