<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.sockets.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'function.socket-select.php',
    1 => 'socket_select',
    2 => 'Ex&eacute;cute l\'appel syst&egrave;me select() sur un tableau de sockets avec une dur&eacute;e d\'expiration',
  ),
  'up' => 
  array (
    0 => 'ref.sockets.php',
    1 => 'Fonctions sur les sockets',
  ),
  'prev' => 
  array (
    0 => 'function.socket-recvmsg.php',
    1 => 'socket_recvmsg',
  ),
  'next' => 
  array (
    0 => 'function.socket-send.php',
    1 => 'socket_send',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/sockets/functions/socket-select.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.socket-select" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">socket_select</h1>
  <p class="verinfo">(PHP 4 &gt;= 4.1.0, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">socket_select</span> &mdash; <span class="dc-title">Exécute l&#039;appel système select() sur un tableau de sockets avec une durée d&#039;expiration</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.socket-select-description">
  <h3 class="title">Description</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>socket_select</strong></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.array.php" class="type array">array</a></span></span> <code class="parameter reference">&$read</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.array.php" class="type array">array</a></span></span> <code class="parameter reference">&$write</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.array.php" class="type array">array</a></span></span> <code class="parameter reference">&$except</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.integer.php" class="type int">int</a></span></span> <code class="parameter">$seconds</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$microseconds</code><span class="initializer"> = 0</span></span><br>): <span class="type"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>

  <p class="para rdfs-comment">
   <span class="function"><strong>socket_select()</strong></span> accepte un tableau de sockets et
   attend qu&#039;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.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.socket-select-parameters">
  <h3 class="title">Liste de paramètres</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">read</code></dt>
     <dd>
      <p class="para">
       Les sockets listés dans le paramètre <code class="parameter">read</code>
       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 <span class="function"><a href="function.socket-read.php" class="function">socket_read()</a></span>
       retournera une chaîne de taille zéro).
      </p>
     </dd>
    
    
     <dt><code class="parameter">write</code></dt>
     <dd>
      <p class="para">
       Les sockets listés dans <code class="parameter">write</code> seront surveillés
       en écriture : pour voir si une écriture ne va pas bloquer.
      </p>
     </dd>
    
    
     <dt><code class="parameter">except</code></dt>
     <dd>
      <p class="para">
       Les sockets listés dans <code class="parameter">except</code> seront surveillés pour
       leurs exceptions.
      </p>
     </dd>
    
    
     <dt><code class="parameter">seconds</code></dt>
     <dd>
      <p class="para">
       Les paramètres <code class="parameter">seconds</code> et <code class="parameter">microseconds</code>
       ensembles forment le paramètre <code class="literal">timeout</code> (délai d&#039;expiration).
       Le <code class="literal">timeout</code> est la durée maximale de temps avant que
       <span class="function"><strong>socket_select()</strong></span> ne se termine.
       <code class="parameter">seconds</code> peut être zéro, ce qui fera que
       <span class="function"><strong>socket_select()</strong></span> retournera immédiatement. C&#039;est très
       pratique pour faire du polling (sondage). Si <code class="parameter">seconds</code> est <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>
       (pas de timeout), <span class="function"><strong>socket_select()</strong></span> peut se bloquer indéfiniment.
      </p>
     </dd>
    
    
     <dt><code class="parameter">microseconds</code></dt>
     <dd>
      <p class="para">
      </p>
     </dd>
    
   </dl>
  </p>
  <div class="warning"><strong class="warning">Avertissement</strong>
   <p class="para">
    En sortie de fonction, les tableaux sont modifiés pour indiquer
    quels sockets ont changé d&#039;état.
   </p>
  </div>
  <p class="para">
   Il n&#039;est pas nécessaire de passer tous les tableaux à
   <span class="function"><strong>socket_select()</strong></span>. Il est possible des omettre, ou
   utiliser un tableau vide, ou encore <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> à la place. Il ne faut pas oublier
   que ces tableaux sont passés par <em>référence</em> et
   seront modifiés par <span class="function"><strong>socket_select()</strong></span>.
  </p>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    À cause d&#039;une limitation du moteur Zend actuel, il n&#039;est pas possible
    de passer une constante comme <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> directement comme paramètre à cette
    fonction, qui attend une valeur par référence. À la place, utiliser
    un tableau temporaire ou une expression dont le membre de gauche
    est une variable temporaire :
    <div class="example" id="example-1">
     <p><strong>Exemple #1 Passer <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> à <span class="function"><strong>socket_select()</strong></span></strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$e </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">socket_select</span><span style="color: #007700">(</span><span style="color: #0000BB">$r</span><span style="color: #007700">, </span><span style="color: #0000BB">$w</span><span style="color: #007700">, </span><span style="color: #0000BB">$e</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.socket-select-returnvalues">
  <h3 class="title">Valeurs de retour</h3>
  <p class="para">
   En cas de succès, <span class="function"><strong>socket_select()</strong></span> retourne le nombre de
   sockets contenues dans les tableaux modifiés. Ce nombre peut être zéro si
   la durée maximale d&#039;attente a été atteinte. En cas d&#039;erreur, <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>
   est retourné. Le code d&#039;erreur généré peut être obtenu en appelant la
   fonction <span class="function"><a href="function.socket-last-error.php" class="function">socket_last_error()</a></span>.
  </p>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Il faut s&#039;assurer bien d&#039;utiliser l&#039;opérateur <code class="literal">===</code>
    lorsque l&#039;on vérifie les erreurs. Étant donné que
    <span class="function"><strong>socket_select()</strong></span> peut retourner 0, la comparaison
    avec <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> via <code class="literal">==</code> donnerait <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> :
    <div class="example" id="example-2">
     <p><strong>Exemple #2 Analyser le résultat de <span class="function"><strong>socket_select()</strong></span></strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$e </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br />if (</span><span style="color: #0000BB">false </span><span style="color: #007700">=== </span><span style="color: #0000BB">socket_select</span><span style="color: #007700">(</span><span style="color: #0000BB">$r</span><span style="color: #007700">, </span><span style="color: #0000BB">$w</span><span style="color: #007700">, </span><span style="color: #0000BB">$e</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">)) {<br />    echo </span><span style="color: #DD0000">"socket_select() a échoué. Raison : " </span><span style="color: #007700">.<br />        </span><span style="color: #0000BB">socket_strerror</span><span style="color: #007700">(</span><span style="color: #0000BB">socket_last_error</span><span style="color: #007700">()) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 examples" id="refsect1-function.socket-select-examples">
  <h3 class="title">Exemples</h3>
  <p class="para">
   <div class="example" id="example-3">
    <p><strong>Exemple #3 Exemple avec <span class="function"><strong>socket_select()</strong></span></strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/* Prépare le tableau read (socket surveillées en lecture) */<br /></span><span style="color: #0000BB">$read   </span><span style="color: #007700">= array(</span><span style="color: #0000BB">$socket1</span><span style="color: #007700">, </span><span style="color: #0000BB">$socket2</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$write  </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$except </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$num_changed_sockets </span><span style="color: #007700">= </span><span style="color: #0000BB">socket_select</span><span style="color: #007700">(</span><span style="color: #0000BB">$read</span><span style="color: #007700">, </span><span style="color: #0000BB">$write</span><span style="color: #007700">, </span><span style="color: #0000BB">$except</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /><br />if (</span><span style="color: #0000BB">$num_changed_sockets </span><span style="color: #007700">=== </span><span style="color: #0000BB">false</span><span style="color: #007700">) {<br />  </span><span style="color: #FF8000">/* Gestion des erreurs */<br /></span><span style="color: #007700">} else if (</span><span style="color: #0000BB">$num_changed_sockets </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br />  </span><span style="color: #FF8000">/* Au moins une des sockets a été modifiée */<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 notes" id="refsect1-function.socket-select-notes">
  <h3 class="title">Notes</h3>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Il faut se méfier des implémentations de sockets, qui doivent être manipulées avec
    délicatesse. Quelques règles de base :
    <ul class="itemizedlist">
     <li class="listitem">
      <span class="simpara">
       Il faut toujours essayer d&#039;utiliser <span class="function"><strong>socket_select()</strong></span>
       sans timeout. Le programme ne devrait avoir rien à faire si
       il n&#039;y a pas de données disponibles. Le code qui dépend d&#039;un
       timeout est généralement peu portable, et difficile à déboguer.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Un socket ne doit pas être ajouté à l&#039;un des tableaux en paramètre,
       si on ne souhaite pas vérifier le résultat après l&#039;appel à
       <span class="function"><strong>socket_select()</strong></span>. Après le retour de
       <span class="function"><strong>socket_select()</strong></span>, 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.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Si l&#039;on écrit ou lit avec un socket retourné dans un tableau,
       il faut savoir qu&#039;il ne pourra pas écrire ou lire toutes les données
       que l&#039;on demande. Il faut être prêt à ne pouvoir lire qu&#039;un seul octet.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Il est commun à la plupart des implémentations de socket que la seule
       exception interceptée par les sockets dans le tableau
       <code class="parameter">except</code> soit le cas des données hors limites,
       reçues par un socket.
      </span>
     </li>
    </ul>
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.socket-select-seealso">
  <h3 class="title">Voir aussi</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="function"><a href="function.socket-read.php" class="function" rel="rdfs-seeAlso">socket_read()</a> - Lit des donn&eacute;es d'un socket</span></li>
    <li><span class="function"><a href="function.socket-write.php" class="function" rel="rdfs-seeAlso">socket_write()</a> - &Eacute;crit dans un socket</span></li>
    <li><span class="function"><a href="function.socket-last-error.php" class="function" rel="rdfs-seeAlso">socket_last_error()</a> - Lit la derni&egrave;re erreur g&eacute;n&eacute;r&eacute;e par un socket</span></li>
    <li><span class="function"><a href="function.socket-strerror.php" class="function" rel="rdfs-seeAlso">socket_strerror()</a> - Retourne une cha&icirc;ne d&eacute;crivant un message d'erreur</span></li>
   </ul>
  </p>
 </div>


</div><?php manual_footer($setup); ?>