<?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 => 'de',
  ),
  'this' => 
  array (
    0 => 'function.socket-select.php',
    1 => 'socket_select',
    2 => 'F&uuml;hrt einen select()-Systemaufruf auf den gegebenen Socket-Arrays aus,
   wobei ein Zeitlimit bestimmt wird',
  ),
  'up' => 
  array (
    0 => 'ref.sockets.php',
    1 => 'Socket-Funktionen',
  ),
  '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' => 'de',
    '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">
   Führt einen select()-Systemaufruf auf den gegebenen Socket-Arrays aus,
   wobei ein Zeitlimit bestimmt wird
  </span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.socket-select-description">
  <h3 class="title">Beschreibung</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> nimmt als Parameter Socket-Arrays entgegen
   und wartet, ob diese ihren Status ändern. Diejenigen, die Hintergrundwissen
   über BSD-Sockets haben, werden feststellen, dass diese Socket-Arrays in
   Wirklichkeit die sogenannten Dateideskriptor-Mengen sind. Drei voneinander
   unabhängige Arrays mit Sockets werden überwacht.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.socket-select-parameters">
  <h3 class="title">Parameter-Liste</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">read</code></dt>
     <dd>
      <p class="para">
       Die Sockets, die im <code class="parameter">read</code>-Array aufgelistet sind,
       werden daraufhin überwacht, ob Zeichen zum Auslesen zur Verfügung
       gestellt werden. (Um genauer zu sein: es wird überwacht, ob ein
       Lesevorgang nicht blockiert würde - ein Socket ist nämlich auch dann
       bereit, wenn er bis zum Dateiende gelesen hat. In diesem Fall gibt
       <span class="function"><a href="function.socket-read.php" class="function">socket_read()</a></span> einen leeren String zurück.)
      </p>
     </dd>
    
    
     <dt><code class="parameter">write</code></dt>
     <dd>
      <p class="para">
       Die Sockets, die im <code class="parameter">write</code>-Array aufgelistet
       sind, werden daraufhin überwacht, ob ein Schreibvorgang nicht blockiert
       würde.
      </p>
     </dd>
    
    
     <dt><code class="parameter">except</code></dt>
     <dd>
      <p class="para">
       Die Sockets, die im <code class="parameter">except</code>-Array aufgelistet
       sind, werden auf Ausnahmen überwacht.
      </p>
     </dd>
    
    
     <dt><code class="parameter">seconds</code></dt>
     <dd>
      <p class="para">
       <code class="parameter">seconds</code> und <code class="parameter">microseconds</code>
       bilden zusammen den <code class="literal">timeout</code>-Parameter. Der
       <code class="literal">timeout</code> ist eine obere Schranke für die Zeit, die
       verstreichen kann, bis <span class="function"><strong>socket_select()</strong></span> zurückkehrt.
       <code class="parameter">seconds</code> kann 0 sein, wodurch
       <span class="function"><strong>socket_select()</strong></span> sofort zurückkehrt. Dies ist
       nützlich beim Polling. Falls der Parameter <code class="parameter">seconds</code>
       <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> ist (kein Timeout), kann <span class="function"><strong>socket_select()</strong></span>
       unendlich lange blockieren.
      </p>
     </dd>
    
    
     <dt><code class="parameter">microseconds</code></dt>
     <dd>
      <p class="para">
      </p>
     </dd>
    
   </dl>
  </p>
  <div class="warning"><strong class="warning">Warnung</strong>
   <p class="para">
    Beim Beenden werden alle Arrays aktualisiert, und zeigen an, welche
    Sockets ihren Status geändert haben.
   </p>
  </div>
  <p class="para">
   Sie brauchen nicht jedes Array einzeln an <span class="function"><strong>socket_select()</strong></span>
   übergeben. Sie können die Arrays auch weglassen und stattdessen leere
   Arrays oder <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> angeben. Vergessen Sie nicht, dass diese Arrays
   <em>per Referenz</em> übergeben werden, und dass sie
   verändert werden, nachdem die Funktion <span class="function"><strong>socket_select()</strong></span>
   beendet ist.
  </p>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Wegen einer Einschränkung in der aktuellen Zend Engine ist es nicht möglich,
    eine Konstante, wie etwa <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>, direkt als Parameter an Funktionen zu
    übergeben, die ihre Argumente als Referenzen erwarten.
    Statt dessen kann eine temporäre Variable oder eine Ausdruck, in dem der am
    weitesten links stehende Teilausdruck eine temporäre Variable ist, verwendet
    werden.
    <div class="example" id="example-1">
     <p><strong>Beispiel #1 <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> mit <span class="function"><strong>socket_select()</strong></span> benutzen:</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">Rückgabewerte</h3>
  <p class="para">
   Bei Erfolg gibt <span class="function"><strong>socket_select()</strong></span> die Anzahl der
   Sockets zurück, die in den aktualisierten Arrays enthalten sind.
   Falls der Timeout wirksam wird, bevor irgend etwas Interessantes passiert,
   ist das Funktionsergebnis 0. Falls ein Fehler auftritt, wird <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>
   zurückgegeben. Der Fehlercode kann dann mit
   <span class="function"><a href="function.socket-last-error.php" class="function">socket_last_error()</a></span> abgefragt werden.
  </p>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Wenn ein Fehler aufgespürt werden soll, muss unbedingt der
    Operator <code class="literal">===</code> benutzt werden. Weil
    <span class="function"><strong>socket_select()</strong></span> auch 0 zurückgeben kann, wird der
    Vergleich mit <code class="literal">==</code> sonst zu <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> ausgewertet.
    <div class="example" id="example-2">
     <p><strong>Beispiel #2 Rückgaben von <span class="function"><strong>socket_select()</strong></span> verstehen</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() fehlgeschlagen, Grund: " </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">Beispiele</h3>
  <p class="para">
   <div class="example" id="example-3">
    <p><strong>Beispiel #3 <span class="function"><strong>socket_select()</strong></span>-Beispiel</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">/* Das Array read vorbereiten */<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">/* Fehlerbehandlung */<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">/* Mindestens an einem Socket ist etwas Interessantes passiert */<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">Anmerkungen</h3>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Seien Sie sich bewusst, dass manche Socket-Implementierungen sehr
    sorgfältig benutzt werden müssen. Ein paar grundsätzliche Regeln:
    <ul class="itemizedlist">
     <li class="listitem">
      <span class="simpara">
       Sie sollten immer versuchen, <span class="function"><strong>socket_select()</strong></span> ohne
       Timeout zu benutzen. Ihr Programm sollte nichts zu tun haben, wenn
       keine Daten verfügbar sind. Code, der von Zeitbegrenzungen abhängig
       ist, ist normalerweise nicht portierbar und schwierig zu debuggen.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Es darf kein Socket in die Arrays eingefügt werden, wenn Sie nicht
       vorhaben, die Ergebnisse nach der Ausführung von
       <span class="function"><strong>socket_select()</strong></span> zu prüfen und entsprechend darauf zu
       reagieren. Nachdem <span class="function"><strong>socket_select()</strong></span> beendet ist,
       müssen alle Sockets in allen Socket-Arrays geprüft werden. Jeder
       Socket, der zum Schreiben zur Verfügung steht, muss beschrieben werden
       und aus jedem Socket, der zum Lesen verfügbar ist, muss gelesen werden.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Bei Schreib-/Leseoperationen auf den Sockets in den Arrays muss damit
       gerechnnet werden, dass nicht notwendigerweise alle Daten
       geschrieben/gelesen werden, die angeben wurden. Seien Sie darauf
       vorbereitet, dass Sie möglicherweise nur ein einziges Byte
       schreiben/lesen können.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Fast allen Socket-Implementierungen ist gemeinsam, dass sie nur eine
       einzige Ausnahme in dem Array <code class="parameter">except</code> auffangen
       können. Und zwar, wenn bandexterne Daten von einem Socket empfangen
       werden.
      </span>
     </li>
    </ul>
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.socket-select-seealso">
  <h3 class="title">Siehe auch</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> - Liest h&ouml;chstens die angegebene Anzahl Bytes von einem Socket</span></li>
    <li><span class="function"><a href="function.socket-write.php" class="function" rel="rdfs-seeAlso">socket_write()</a> - Schreibt in einen Socket</span></li>
    <li><span class="function"><a href="function.socket-last-error.php" class="function" rel="rdfs-seeAlso">socket_last_error()</a> - Gibt den letzten Fehler zur&uuml;ck, der an einem Socket aufgetreten ist</span></li>
    <li><span class="function"><a href="function.socket-strerror.php" class="function" rel="rdfs-seeAlso">socket_strerror()</a> - Gibt einen String zur&uuml;ck, der einen Socket-Fehler beschreibt</span></li>
   </ul>
  </p>
 </div>


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