<?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="modifier">function</span> <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="simpara">
   <span class="function"><strong>stream_select()</strong></span> acepta un array de flujos y
   espera a que alguno de ellos cambie de estado. Es el equivalente de
   <span class="function"><a href="function.socket-select.php" class="function">socket_select()</a></span> para los flujos, pero ambas funciones no
   se comportan igual en todos los aspectos: no señalan los argumentos
   inválidos de la misma manera, y <span class="function"><strong>stream_select()</strong></span> puede
   terminar sin consultar en absoluto al sistema operativo, tal como se describe
   en las notas siguientes.
  </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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/* Preparación del array de flujos de lectura */
</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">);
</span><span style="color: #0000BB">$write  </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;
</span><span style="color: #0000BB">$except </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;
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">))) {
    </span><span style="color: #FF8000">/* Manejo de errores */
</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">) {
    </span><span style="color: #FF8000">/* Al menos uno de los flujos ha cambiado */
</span><span style="color: #007700">}
</span><span style="color: #0000BB">?&gt;</span></code></pre></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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$e </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</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">);
</span><span style="color: #0000BB">?&gt;</span></code></pre></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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$e </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;
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">)) {
    echo </span><span style="color: #DD0000">"stream_select() falló\n"</span><span style="color: #007700">;
}
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="simpara">
    Al leer de un flujo devuelto en los arrays, o al escribir en él, tenga en
    cuenta que no se lee ni se escribe necesariamente la totalidad de los datos
    solicitados. Esté preparado para tratar tan solo un byte.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="simpara">
    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>: 
   <p class="simpara">
    Un flujo que ya dispone de datos almacenados en el búfer del lado de PHP se
    señala como listo sin que se realice la llamada
    <code class="literal">select()</code> subyacente. En ese caso, los arrays
    <code class="parameter">write</code> y <code class="parameter">except</code> se vacían sin
    haber sido examinados: un flujo que estaba listo para escritura no se
    señala, y el valor de retorno solo cuenta los flujos disponibles para
    lectura.
   </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">Véase 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>
   <li><span class="function"><a href="function.socket-select.php" class="function" rel="rdfs-seeAlso">socket_select()</a> - Ejecuta la llamada al sistema select() sobre un array de sockets con un tiempo de expiraci&oacute;n</span></li>
  </ul>
 </div>

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