<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.stream.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'function.stream-select.php',
    1 => 'stream_select',
    2 => 'Surveille la modification d\'un ou plusieurs flux',
  ),
  'up' => 
  array (
    0 => 'ref.stream.php',
    1 => 'Fonctions sur les flux',
  ),
  'prev' => 
  array (
    0 => 'function.stream-resolve-include-path.php',
    1 => 'stream_resolve_include_path',
  ),
  'next' => 
  array (
    0 => 'function.stream-set-blocking.php',
    1 => 'stream_set_blocking',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/stream/functions/stream-select.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.stream-select" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">stream_select</h1>
  <p class="verinfo">(PHP 4 &gt;= 4.3.0, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">stream_select</span> &mdash; <span class="dc-title">Surveille la modification d&#039;un ou plusieurs flux</span></p>

 </div>
 <div class="refsect1 description" id="refsect1-function.stream-select-description">
  <h3 class="title">Description</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>stream_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"><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">$microseconds</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></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>stream_select()</strong></span> accepte un tableau de flux et
   attend que l&#039;un d&#039;entre eux change de statut. Cette opération est
   équivalente à ce que fait la fonction <span class="function"><a href="function.socket-select.php" class="function">socket_select()</a></span>,
   hormis le fait qu&#039;elle travaille sur un flux.
  </p>
 </div>

 
 <div class="refsect1 parameters" id="refsect1-function.stream-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 flux qui sont listés dans le paramètre <code class="parameter">read</code>
       seront surveillés en lecture, c&#039;est-à-dire si de nouveaux octets
       sont disponibles en lecture (pour être précis, si une lecture ne
       bloquera pas, ce qui inclut aussi les flux qui sont en fin de 
       fichier, auquel cas un appel à la fonction <span class="function"><a href="function.fread.php" class="function">fread()</a></span>
       retourne une chaîne de taille 0).
      </p>
     </dd>
    
    
     <dt><code class="parameter">write</code></dt>
     <dd>
      <p class="para">
       Les flux qui sont listés dans le paramètre <code class="parameter">write</code>
       seront surveillés en écriture (pour être précis, si une écriture ne
       bloquera pas).
      </p>
     </dd>
    
    
     <dt><code class="parameter">except</code></dt>
     <dd>
      <p class="para">
       Les flux qui sont listés dans le paramètre <code class="parameter">except</code>
       seront surveillés pour détecter l&#039;arrivée de données exceptionnelles (&quot;out-of-band&quot;) de haute priorité.
      </p>
      <blockquote class="note"><p><strong class="note">Note</strong>: 
       <p class="para">
        Lorsque <span class="function"><strong>stream_select()</strong></span> se termine, les tableaux
        <code class="parameter">read</code>, <code class="parameter">write</code> et
        <code class="parameter">except</code> sont modifiés pour indiquer quels flux
        ont actuellement changé de statut.
        Les clés originales du tableau sont préservées.
       </p>
      </p></blockquote>
     </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>
       forment le <em>délai d&#039;expiration</em>,
       <code class="parameter">seconds</code> spécifie le nombre de secondes
       tandis que <code class="parameter">microseconds</code>, le nombre de 
       microsecondes. Le paramètre <code class="parameter">timeout</code>
       représente la limite supérieure du temps que 
       <span class="function"><strong>stream_select()</strong></span> doit attendre avant de
       se terminer. Si <code class="parameter">seconds</code> est défini
       à <code class="literal">0</code> et <code class="parameter">microseconds</code>
       vaut <code class="literal">0</code> ou <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>,
       <span class="function"><strong>stream_select()</strong></span> n&#039;attendra
       pas de données - à la place, elle se terminera immédiatement,
       indiquant le statut courant du flux.
      </p>
      <p class="para">
       Si <code class="parameter">seconds</code> vaut <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>, 
       <span class="function"><strong>stream_select()</strong></span> peut se bloquer indéfiniment,
       se terminant uniquement lorsqu&#039;un événement sur un des flux surveillés
       survient (ou si un signal interrompt l&#039;appel système).
      </p>
      <div class="warning"><strong class="warning">Avertissement</strong>
       <p class="para">
        Utiliser une valeur de <code class="literal">0</code> permet de 
        tester instantanément le statut des flux, mais il faut savoir
        qu&#039;il n&#039;est pas recommandé d&#039;utiliser <code class="literal">0</code> 
        dans une boucle, car cela va faire consommer énormément de
        processeur au script.
       </p>
       <p class="para">
        Il est bien mieux de spécifier une valeur de quelques secondes, même
        si l&#039;on doit surveiller et exécuter différents codes de manière
        simultanée. Par exemple, utiliser une valeur d&#039;au moins 
        <code class="literal">200000</code> microsecondes, l&#039;on réduira considérablement
        la consommation processeur du script.
       </p>
       <p class="para">
        Il ne faut pas oublier que la valeur d&#039;expiration est la durée maximale
        d&#039;attente, si rien ne se passe : <span class="function"><strong>stream_select()</strong></span> 
        retourne un résultat dès que l&#039;un des flux soumis est prêt à
        l&#039;utilisation.
       </p>
      </div>
     </dd>
    
    
     <dt><code class="parameter">microseconds</code></dt>
     <dd>
      <p class="para">
       Voir la description de <code class="parameter">seconds</code>.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>

 
 <div class="refsect1 returnvalues" id="refsect1-function.stream-select-returnvalues">
  <h3 class="title">Valeurs de retour</h3>
  <p class="para">
   En cas de succès, <span class="function"><strong>stream_select()</strong></span> retourne
   le nombre de flux qui ont évolué, ce qui peut être <code class="literal">0</code>, si 
   le délai d&#039;expiration a été atteint avant que les flux n&#039;évoluent.
   En cas d&#039;erreur, la fonction retourne <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> et un
   avertissement sera renvoyé (cela peut apparaître si l&#039;appel
   système est interrompu par un signal entrant).
  </p>
 </div>


 <div class="refsect1 changelog" id="refsect1-function.stream-select-changelog">
  <h3 class="title">Historique</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Version</th>
      <th>Description</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>8.1.0</td>
      <td>
       <code class="parameter">microseconds</code> est désormais nullable.
      </td>
     </tr>

    </tbody>
   
  </table>

 </div>

 
 <div class="refsect1 examples" id="refsect1-function.stream-select-examples">
  <h3 class="title">Exemples</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Exemple #1 Exemple avec <span class="function"><strong>stream_select()</strong></span></strong></p>
    <div class="example-contents"><p>
     Cet exemple surveille si des données arrivent pour être
     lues soit dans <code class="parameter">$stream1</code>, soit dans
     <code class="parameter">$stream2</code>. Si le délai d&#039;expiration
     vaut <code class="literal">0</code>, la fonction se termine immédiatement :
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/* Preparation du tableau de flux lecture */<br /></span><span style="color: #0000BB">$read   </span><span style="color: #007700">= array(</span><span style="color: #0000BB">$stream1</span><span style="color: #007700">, </span><span style="color: #0000BB">$stream2</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 />if (</span><span style="color: #0000BB">false </span><span style="color: #007700">=== (</span><span style="color: #0000BB">$num_changed_streams </span><span style="color: #007700">= </span><span style="color: #0000BB">stream_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 />    </span><span style="color: #FF8000">/* Gestion d'erreur */<br /></span><span style="color: #007700">} elseif (</span><span style="color: #0000BB">$num_changed_streams </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 un des flux a évolué  */<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.stream-select-notes">
  <h3 class="title">Notes</h3>
  <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 la valeur <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> directement comme paramètre d&#039;une fonction
    qui s&#039;attend à des paramètres passés par référence. Au lieu de cela,
    il est recommandé d&#039;utiliser une variable temporaire, ou une expression
    dont le membre de gauche est une variable temporaire. Comme ceci :
    <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">stream_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>

   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Il faut s&#039;assurer de bien utiliser l&#039;opérateur <code class="literal">===</code> lorsque l&#039;on
    recherche des erreurs. Comme <span class="function"><strong>stream_select()</strong></span> peut retourner
    0, une comparaison effectuée à l&#039;aide de <code class="literal">==</code>
    l&#039;évaluerait à <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> :
    <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">stream_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">"stream_select() failed\n"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Si l&#039;on a écrit ou lu dans un flux qui est retourné dans les tableaux
    de flux, soyez bien conscient que ces flux n&#039;ont peut être pas écrit
    ou lu la totalité des données demandées. Soyez en
    mesure de lire un seul octet.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Quelques flux (comme <code class="literal">zlib</code>) ne peuvent pas être
    sélectionnés par cette fonction.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <strong>Compatibilité Windows</strong><br />
   <p class="para">
    Utiliser la fonction <span class="function"><strong>stream_select()</strong></span>
    sur un pointeur de fichier retourné par <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span>
    échoue et retourne <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> sous Windows.
   </p>
   <p class="para">
    <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong> depuis une console change son statut dès que
    <em>n&#039;importe</em> quels événements d&#039;entrées sont disponibles,
    mais lire depuis un flux peut toujours être bloquant.
   </p>
  </p></blockquote>
 </div>

 
 <div class="refsect1 seealso" id="refsect1-function.stream-select-seealso">
  <h3 class="title">Voir aussi</h3>
  <ul class="simplelist">
   <li><span class="function"><a href="function.stream-set-blocking.php" class="function" rel="rdfs-seeAlso">stream_set_blocking()</a> - Configure le mode bloquant d'un flux</span></li>
  </ul>
 </div>

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