Rechercher une fonction PHP

socket_select

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

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

Description

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

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.

Retour à la première page de Manuel PHP  Table des matières Haut

Liste de paramètres

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, 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é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.

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

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$e0);
?>

Retour à la première page de Manuel PHP  Table des matières Haut

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$e0)) {
    echo 
"socket_select() a échoué. Raison : " .
        
socket_strerror(socket_last_error()) . "\n";
}
?>

Retour à la première page de Manuel PHP  Table des matières Haut

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$except0);

if (
$num_changed_sockets === false) {
  
/* Gestion des erreurs */
} else if ($num_changed_sockets 0) {
  
/* Au moins une des sockets a été modifiée */
}
?>

Retour à la première page de Manuel PHP  Table des matières Haut

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

Retour à la première page de Manuel PHP  Table des matières Haut

Voir aussi

Rechercher une fonction PHP

Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-socket-select.html

L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.

Références

  1. Consulter le document html Langue du document :fr Manuel PHP : http://php.net

Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.

Table des matières Haut