<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'function.stream-select.php',
    1 => 'stream_select',
    2 => 'Supervisa la modificaci&oacute;n de uno o varios flujos',
  ),
  'up' => 
  array (
    0 => 'ref.stream.php',
    1 => 'Funciones de Flujos',
  ),
  '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' => 'es',
    '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">Supervisa la modificación de uno o varios flujos</span></p>

 </div>
 <div class="refsect1 description" id="refsect1-function.stream-select-description">
  <h3 class="title">Descripción</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> acepta un array de flujos y
   espera a que alguno de ellos cambie de estado. Esta operación es
   equivalente a lo que hace la función <span class="function"><a href="function.socket-select.php" class="function">socket_select()</a></span>,
   salvo que trabaja sobre un flujo.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.stream-select-parameters">
  <h3 class="title">Parámetros</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">read</code></dt>
     <dd>
      <p class="para">
       Los flujos que están listados en el parámetro <code class="parameter">read</code>
       serán supervisados en lectura, es decir, si hay nuevos bytes
       disponibles para lectura (para ser precisos, si una lectura no
       bloqueará, lo que incluye también flujos que están al final de
       archivo, en cuyo caso una llamada a la función <span class="function"><a href="function.fread.php" class="function">fread()</a></span>
       retornará un string de tamaño 0).
      </p>
     </dd>
    
    
     <dt><code class="parameter">write</code></dt>
     <dd>
      <p class="para">
       Los flujos que están listados en el parámetro <code class="parameter">write</code>
       serán supervisados en escritura (para ser precisos, si una escritura no
       bloqueará).
      </p>
     </dd>
    
    
     <dt><code class="parameter">except</code></dt>
     <dd>
      <p class="para">
       Los flujos que están listados en el parámetro <code class="parameter">except</code>
       serán supervisados para ver si se lanza una excepción.
      </p>
      <blockquote class="note"><p><strong class="note">Nota</strong>: 
       <p class="para">
        Cuando <span class="function"><strong>stream_select()</strong></span> termina, los arrays
        <code class="parameter">read</code>, <code class="parameter">write</code> y
        <code class="parameter">except</code> son modificados para indicar qué flujos
        han cambiado de estado actualmente.
        Las claves originales del array se preservan.
       </p>
      </p></blockquote>
     </dd>
    
    
     <dt><code class="parameter">seconds</code></dt>
     <dd>
      <p class="para">
       Los parámetros <code class="parameter">seconds</code> y
       <code class="parameter">microseconds</code>
       forman el <em>tiempo límite</em>,
       <code class="parameter">seconds</code> especifica el número de segundos
       mientras que <code class="parameter">microseconds</code>, el número de
       microsegundos. El parámetro <code class="parameter">timeout</code>
       representa el límite superior del tiempo que
       <span class="function"><strong>stream_select()</strong></span> debe esperar antes de
       terminar. Si <code class="parameter">seconds</code> está definido
       a <code class="literal">0</code> y <code class="parameter">microseconds</code>
       vale <code class="literal">0</code> o <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>,
       <span class="function"><strong>stream_select()</strong></span> no esperará
       datos - en su lugar, terminará inmediatamente,
       indicando el estado actual del flujo.
      </p>
      <p class="para">
       Si <code class="parameter">seconds</code> vale <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>,
       <span class="function"><strong>stream_select()</strong></span> puede bloquearse indefinidamente,
       terminando únicamente cuando un evento en alguno de los flujos supervisados
       ocurra (o si una señal interrumpe la llamada al sistema).
      </p>
      <div class="warning"><strong class="warning">Advertencia</strong>
       <p class="para">
        Utilizar un valor de <code class="literal">0</code> permite
        probar instantáneamente el estado de los flujos, pero debe saberse
        que no se recomienda utilizar <code class="literal">0</code>
        en un bucle, ya que esto hará que el script consuma una gran cantidad
        de procesador.
       </p>
       <p class="para">
        Es mucho mejor especificar un valor de algunos segundos, incluso
        si se debe supervisar y ejecutar diferentes códigos de manera
        simultánea. Por ejemplo, utilizar un valor de al menos
        <code class="literal">200000</code> microsegundos, se reducirá considerablemente
        el consumo de procesador del script.
       </p>
       <p class="para">
        No se debe olvidar que el valor de expiración es la duración máxima
        de espera, si no ocurre nada: <span class="function"><strong>stream_select()</strong></span>
        retornará un resultado tan pronto como uno de los flujos suministrados esté listo para
        su uso.
       </p>
      </div>
     </dd>
    
    
     <dt><code class="parameter">microseconds</code></dt>
     <dd>
      <p class="para">
       Véase la descripción de <code class="parameter">seconds</code>.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.stream-select-returnvalues">
  <h3 class="title">Valores devueltos</h3>
  <p class="para">
   En caso de éxito, <span class="function"><strong>stream_select()</strong></span> retorna
   el número de flujos que han cambiado, lo que puede ser <code class="literal">0</code>, si
   el tiempo límite fue alcanzado antes de que los flujos cambien.
   En caso de error, la función retornará <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> y un
   aviso será devuelto (esto puede ocurrir si la llamada
   al sistema es interrumpida por una señal entrante).
  </p>
 </div>


 <div class="refsect1 changelog" id="refsect1-function.stream-select-changelog">
  <h3 class="title">Historial de cambios</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Versión</th>
      <th>Descripción</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>8.1.0</td>
      <td>
       <code class="parameter">microseconds</code> ahora es nullable.
      </td>
     </tr>

    </tbody>
   
  </table>

 </div>


 <div class="refsect1 examples" id="refsect1-function.stream-select-examples">
  <h3 class="title">Ejemplos</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Ejemplo con <span class="function"><strong>stream_select()</strong></span></strong></p>
    <div class="example-contents"><p>
     Este ejemplo supervisa si los datos llegan para ser
     leídos ya sea en <code class="parameter">$stream1</code> o en
     <code class="parameter">$stream2</code>. Si el tiempo límite
     es <code class="literal">0</code>, la función termina inmediatamente:
    </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">/* Preparación del array de flujos de lectura */<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">/* Manejo de errores */<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">/* Al menos uno de los flujos ha cambiado */<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">Notas</h3>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Debido a una limitación del motor Zend actual, no es posible
    pasar el valor <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> directamente como parámetro de una función
    que espera parámetros pasados por referencia. En su lugar,
    se recomienda utilizar una variable temporal, o una expresión
    cuyo miembro izquierdo sea una variable temporal. Como esto:
    <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">Nota</strong>: 
   <p class="para">
    Asegúrese de utilizar el operador <code class="literal">===</code> cuando
    busque errores. Como <span class="function"><strong>stream_select()</strong></span> puede retornar
    0, una comparación realizada con <code class="literal">==</code>
    lo evaluaría como <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() falló\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">Nota</strong>: 
   <p class="para">
    Si ha escrito o leído en un flujo que es retornado en los arrays
    de flujos, sea consciente de que estos flujos pueden no haber escrito
    o leído la totalidad de los datos solicitados. Sea
    capaz de leer un solo byte.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Algunos flujos (como <code class="literal">zlib</code>) no pueden ser
    seleccionados por esta función.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <strong>Compatibilidad con Windows</strong><br />
   <p class="para">
    Utilizar la función <span class="function"><strong>stream_select()</strong></span>
    en un puntero de archivo retornado por <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span>
    fallará y retornará <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> en Windows.
   </p>
   <p class="para">
    <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong> desde una consola cambia su estado tan pronto como
    <em>cualquier</em> evento de entrada esté disponible,
    pero leer desde un flujo puede seguir siendo bloqueante.
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.stream-select-seealso">
  <h3 class="title">Ver también</h3>
  <ul class="simplelist">
   <li><span class="function"><a href="function.stream-set-blocking.php" class="function" rel="rdfs-seeAlso">stream_set_blocking()</a> - Configura el modo de bloqueo de un flujo</span></li>
  </ul>
 </div>

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