<?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 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'function.socket-select.php',
    1 => 'socket_select',
    2 => 'Executa a chamada de sistema select() nos arrays de soquetes fornecidos com um tempo limite especificado',
  ),
  'up' => 
  array (
    0 => 'ref.sockets.php',
    1 => 'Fun&ccedil;&otilde;es de Socket',
  ),
  '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' => 'pt_BR',
    '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">Executa a chamada de sistema select() nos arrays de soquetes fornecidos com um tempo limite especificado</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.socket-select-description">
  <h3 class="title">Descrição</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> aceita arrays de soquetes e espera que
   eles mudem de status. Usuários com experiência em soquetes BSD
   reconhecerão que esses arrays de soquete são na verdade os chamados conjuntos
   de descritores de arquivos. Três arrays independentes de soquetes são monitoradas.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.socket-select-parameters">
  <h3 class="title">Parâmetros</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">read</code></dt>
     <dd>
      <p class="para">
       Os soquetes listados no array <code class="parameter">read</code> serão
       observados para ver se os caracteres ficam disponíveis para leitura (mais
       precisamente, para ver se uma leitura não será bloqueada - em particular, um soquete
       também estará pronto no final do arquivo, nesse caso uma chamada a
       <span class="function"><a href="function.socket-read.php" class="function">socket_read()</a></span> retornará uma string de comprimento zero).
      </p>
     </dd>
    
    
     <dt><code class="parameter">write</code></dt>
     <dd>
      <p class="para">
       Os soquetes listados no array <code class="parameter">write</code> serão
       observados para ver se uma escrita não será bloqueada.
      </p>
     </dd>
    
    
     <dt><code class="parameter">except</code></dt>
     <dd>
      <p class="para">
       Os soquetes listados no array <code class="parameter">except</code> serão
       observados em busca de exceções.
      </p>
     </dd>
    
    
     <dt><code class="parameter">seconds</code></dt>
     <dd>
      <p class="para">
       Os parâmetros <code class="parameter">seconds</code> e <code class="parameter">microseconds</code>
       juntos formam o parâmetro de tempo limite (<code class="literal">timeout</code>). O tempo limite
       (<code class="literal">timeout</code>) é um limite superior no tempo
       decorrido antes que <span class="function"><strong>socket_select()</strong></span> retorne.
       <code class="parameter">seconds</code> pode ser zero, o que faz com que
       <span class="function"><strong>socket_select()</strong></span> retorne imediatamente. Isto é útil
       para pesquisas. Se <code class="parameter">seconds</code> for <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (sem tempo limite),
       <span class="function"><strong>socket_select()</strong></span> pode bloquear indefinidamente.
      </p>
     </dd>
    
    
     <dt><code class="parameter">microseconds</code></dt>
     <dd>
      <p class="para">
      </p>
     </dd>
    
   </dl>
  </p>
  <div class="warning"><strong class="warning">Aviso</strong>
   <p class="para">
    Na saída, os arrays são modificados para indicar qual soquete
    realmente mudou de status.
   </p>
  </div>
  <p class="para">
   Não é necessário passar todos os arrays para
   <span class="function"><strong>socket_select()</strong></span>. Em vez disso, pode-se usar um
   array vazio ou <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>. Também deve-se lembrar que esses arrays são
   passados ​​<em>por referência</em> e serão modificados após
   o retorno de <span class="function"><strong>socket_select()</strong></span>.
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Devido a uma limitação no Motor Zend atual, não é possível passar um
    modificador constante como <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> diretamente como parâmetro para uma função
    que espera que esse parâmetro seja passado por referência. Em vez disso,
    use uma variável temporária ou uma expressão com o membro mais à esquerda sendo uma
    variável temporária:
    <div class="example" id="example-1">
     <p><strong>Exemplo #1 Usando <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> com <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">Valor Retornado</h3>
  <p class="para">
   Em caso de sucesso, <span class="function"><strong>socket_select()</strong></span> retorna o número de
   soquetes contidos nos arrays modificados, que pode ser zero se
   o tempo limite expirar antes que algo interessante aconteça. Em caso de erro,
   retorna <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>. O código de erro pode ser recuperado com
   <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">Nota</strong>: 
   <p class="para">
    Certifique-se de usar o operador <code class="literal">===</code> ao verificar se
    há um erro. Como <span class="function"><strong>socket_select()</strong></span> pode retornar 0,
    a comparação com <code class="literal">==</code> seria avaliada como <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>:
    <div class="example" id="example-2">
     <p><strong>Exemplo #2 Entendendo o resultado 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() falhou, motivo: " </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">Exemplos</h3>
  <p class="para">
   <div class="example" id="example-3">
    <p><strong>Exemplo #3 Exemplo 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 /></span><span style="color: #FF8000">/* Prepara o array de leitura */<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">/* Tratamento de erro */<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">/* Pelo menos em um dos soquetes algo interessante ocorreu */<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">Notas</h3>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Deve-se ter ciência de que algumas implementações de soquete precisam ser tratadas com muito
    cuidado. Algumas regras básicas:
    <ul class="itemizedlist">
     <li class="listitem">
      <span class="simpara">
       Deve-se sempre tentar usar <span class="function"><strong>socket_select()</strong></span>
       sem tempo limite. A aplicação não deverá ter nada a fazer se
       não houver dados disponíveis. Código que depende de limites de tempo geralmente
       não é portável e é difícil de depurar.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Nenhum soquete deve ser adicionado a nenhum conjunto se não houver intenção de
       verificar seu resultado após a chamada a <span class="function"><strong>socket_select()</strong></span>
       e de responder apropriadamente. Após o retorno de <span class="function"><strong>socket_select()</strong></span>,
       todos os soquetes em todos os arrays devem ser verificados. Qualquer
       soquete disponível para escrita deve ser escrito e
       qualquer soquete disponível para leitura deve ser lido.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Se um retorno de soquete for lido/escrito nos arrays,
       eles não necessariamente leem/escrevem a quantidade total de dados
       solicitada. Deve-se estar preparado para conseguir ler/escrever apenas um único
       byte.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       É comum na maioria das implementações de soquete que a única exceção
       capturada com o array <code class="parameter">except</code> sejam dados fora-de-banda
       recebidos em um soquete.
      </span>
     </li>
    </ul>
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.socket-select-seealso">
  <h3 class="title">Veja Também</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> - L&ecirc; um m&aacute;ximo de bytes de um soquete</span></li>
    <li><span class="function"><a href="function.socket-write.php" class="function" rel="rdfs-seeAlso">socket_write()</a> - Escreve em um soquete</span></li>
    <li><span class="function"><a href="function.socket-last-error.php" class="function" rel="rdfs-seeAlso">socket_last_error()</a> - Retorna o &uacute;ltimo erro no soquete</span></li>
    <li><span class="function"><a href="function.socket-strerror.php" class="function" rel="rdfs-seeAlso">socket_strerror()</a> - Retorna uma string descrevendo um erro no soquete</span></li>
   </ul>
  </p>
 </div>


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