<?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 => 'it',
  ),
  'this' => 
  array (
    0 => 'function.socket-select.php',
    1 => 'socket_select',
    2 => 'Esegue la system call select() su un set di socket con un dato timeout',
  ),
  'up' => 
  array (
    0 => 'ref.sockets.php',
    1 => 'Socket Funzioni',
  ),
  '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' => 'it',
    '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">
       Esegue la system call select() su un set di socket con un dato timeout 
    </span></p>

   </div>
   <div class="refsect1 unknown-1162" id="refsect1-function.socket-select-unknown-1162">
    <h3 class="title">Descrizione</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"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter">$lettura</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter">$scrittura</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter">$except</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">$tv_sec</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">$tv_usec</code><span class="initializer"> = ?</span></span><br>): <span class="type"><a href="language.types.integer.php" class="type int">int</a></span></div>

     <div class="warning"><strong class="warning">Avviso</strong><p class="simpara">Questa funzione è
<em>SPERIMENTALE</em>. Ovvero, il comportamento di questa funzione,
il nome di questa funzione, in definitiva tutto ciò che è documentato qui 
può cambiare nei futuri rilasci del PHP senza preavviso. Siete avvisati, l&#039;uso di questa
funzione è a vostro rischio.</p></div>
    <p class="para">
     La funzione <span class="function"><strong>socket_select()</strong></span> accetta un array di socket e si mette
     in attesa di una variazione di stato su questi. Questa, derivando come background dai socket BSD,
     riconoscerà che questi array di risorse socket sono in realtà 
     dei set di descrittori di file. Saranno monitorati 3 set di 
     socket.
    </p>  
    <p class="para">  
     I socket indicati nell&#039;array <code class="parameter">lettura</code>, saranno monitorati in
     attesa dell&#039;arrivo di caratteri disponibili per la lettura (più precisamente, per verificare
     che una lettura non sia bloccata, una risorsa socket viene definita pronta anche su
     fine file, in questo caso la funzione <span class="function"><a href="function.socket-read.php" class="function">socket_read()</a></span> restituirà
     una stringa di lunghezza zero).
    </p>  
    <p class="para">  
     I socket indicati nell&#039;array di <code class="parameter">scrittura</code>, sarranno monitorati
     per verificare che una scrittura non si blocchi.
    </p>  
    <p class="para">  
     I socket indicati nell&#039;array <code class="parameter">except</code> saranno monitorati
     per rilevare delle eccezioni.
    </p>  
    <div class="warning"><strong class="warning">Avviso</strong> 
     <p class="para">  
      In uscita, gli array sarrano modificati in modo da indicare quale risorsa di tipo socket
      ha variato il proprio stato.
     </p>  
    </div> 
    <p class="para">  
     Non si è obbligati a passare tutti gli array a
     <span class="function"><strong>socket_select()</strong></span>. Se ne possono tralasciare, al loro posto utilizzare
     un array vuoto oppure <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>. Inoltre non si dimentichi che gli array sono passati
     <em>per riferimento</em> e che saranno modificati all&#039;uscita
     dalla funzione <span class="function"><strong>socket_select()</strong></span>.
    </p>  
    <p class="para">  
     <div class="example" id="example-1">
      <p><strong>Example #1 Esempio di <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">/* Preparo l'array di lettura */  <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 />  <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">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">, </span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /><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">/* Gestione dell'errore */  <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">/* Su almeno un socket è accaduto qualcosa di interessante */  <br /></span><span style="color: #007700">}  <br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>  
      </div>
  
     </div>
    </p>  
    <blockquote class="note"><p><strong class="note">Nota</strong>:   
     <p class="para"> 
      A causa delle limitazioni della versione attuale del Zend Engine, non è possibile passare 
      direttamente una costante, ad esempio <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>, come parametro ad una funzione che
      si aspetti questo passato per riferimento. Si utilizzi, invece, una 
      variabile temporanea oppura una espressione il cui membro di sinistra sia una
      variabile temporanea:
      <div class="example" id="example-2">
       <p><strong>Example #2 Uso di <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> con <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 />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">NULL</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>  
    <p class="para">  
     I parametri <code class="parameter">tv_sec</code> ed <code class="parameter">tv_usec</code> 
     insieme indicano il <em>timeout</em>. Il 
     <em>timeout</em> indica il limite superiore di tempo 
     che deve trascorrere prima che la funzione <span class="function"><strong>socket_select()</strong></span> esca.
     <code class="parameter">tv_sec</code> può essere a zero, ciò causa una
     uscita immediata di <span class="function"><strong>socket_select()</strong></span>. Ciò risulta utile nei
     casi di polling. Se <code class="parameter">tv_sec</code> viene impostato a <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (nessun timeout),
     la funzione resta in attesa per un tempo indefinito.
    </p>  
    <p class="para">  
     Se ha successo <span class="function"><strong>socket_select()</strong></span> restituisce il numero
     di risorse socket contenute nell&#039;array modificato, tale valore può essere zero
     se scade il timeout prima che sia accaduto qualcosa. La funzione restituisce <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>
     se si verifica un errore. Il codice di errore può essere recuperato tramite la funzione
     <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"> 
     Si utilizzi l&#039;operatore <code class="literal">===</code> quanto si eseguono dei test per 
     rilevare un errore. Poiché la funzione <span class="function"><strong>socket_select()</strong></span> può restituire 0
     il confronto eseguito con <code class="literal">==</code> sarebbe valutato come <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>:  
      <div class="example" id="example-3">
       <p><strong>Example #3 Comprensione dei risultati di <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: #007700">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">NULL</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() failed, reason: " </span><span style="color: #007700">. </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>  
    <blockquote class="note"><p><strong class="note">Nota</strong>:   
     <p class="para"> 
      Si presti attenzione alle implementazioni di certi socket che richiedono di
      essere gestiti molto attentamente. Alcune regole di base: 
      <ul class="itemizedlist">  
       <li class="listitem">  
        <span class="simpara">  
         Si cerchi di utilizzare sempre <span class="function"><strong>socket_select()</strong></span>
         senza il timeout. Il programma non dovrebbe avere nulla da fare se non ci sono
         dati disponibili. Il codice basato sui timeout solitamente non è migrabile
         ed è difficile da testare.
        </span>  
       </li>  
       <li class="listitem">  
        <span class="simpara"> 
         Nei tre set, non inserire una risorsa socket di cui non si intende
         controllarne il risultato dopo la chiamata a <span class="function"><strong>socket_select()</strong></span>,
         e ne si intende rispondere in modo appropriato. Dopo la chiamata a <span class="function"><strong>socket_select()</strong></span>,
         occorre verificare tutti i socket in tutti gli array. Si deve scrivere
         su qualsiasi socket disponibile per la scrittura, e deve essere letto qualsiasi 
         socket diponibile per la lettura.
        </span>  
       </li>  
       <li class="listitem">  
        <span class="simpara"> 
         Se si ha il ritorno della disponibilità di un socket, sia in lettura che in scrittura,
         non è detto che sia disponile per l&#039;intero ammontare dei dati da scrivere/leggere.
         Occorre essere preparati a gestire il caso in cui la disponibilità sia limitata
         anche ad un solo byte. 
        </span>  
       </li>  
       <li class="listitem">  
        <span class="simpara">  
         Nella maggior parte delle implementazioni dei socket, l&#039;unica eccezione 
         catturata con il parametro <code class="parameter">except</code> è l&#039;arrivo
         di dati fuori banda.
        </span>  
       </li>  
      </ul>  
     </p>  
    </p></blockquote>  
    <p class="para">  
     Vedere anche  
     <span class="function"><a href="function.socket-read.php" class="function">socket_read()</a></span>,  
     <span class="function"><a href="function.socket-write.php" class="function">socket_write()</a></span>,  
     <span class="function"><a href="function.socket-last-error.php" class="function">socket_last_error()</a></span> e  
     <span class="function"><a href="function.socket-strerror.php" class="function">socket_strerror()</a></span>.  
    </p>
   </div>

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