<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/class.eventlistener.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'eventlistener.construct.php',
    1 => 'EventListener::__construct',
    2 => 'Crea un nuevo oyente de conexi&oacute;n asociado con la base de eventos',
  ),
  'up' => 
  array (
    0 => 'class.eventlistener.php',
    1 => 'EventListener',
  ),
  'prev' => 
  array (
    0 => 'class.eventlistener.php',
    1 => 'EventListener',
  ),
  'next' => 
  array (
    0 => 'eventlistener.disable.php',
    1 => 'EventListener::disable',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/event/eventlistener/construct.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="eventlistener.construct" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">EventListener::__construct</h1>
  <p class="verinfo">(PECL event &gt;= 1.2.6-beta)</p><p class="refpurpose"><span class="refname">EventListener::__construct</span> &mdash; <span class="dc-title">Crea un nuevo oyente de conexión asociado con la base de eventos</span></p>

 </div>
 <div class="refsect1 description" id="refsect1-eventlistener.construct-description">
  <h3 class="title">Descripción</h3>
  <div class="methodsynopsis dc-description">
   <span class="modifier">public</span>
   <span class="methodname"><strong>EventListener::__construct</strong></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam">
    
    <span class="type"><a href="class.eventbase.php" class="type EventBase">EventBase</a></span> <code class="parameter">$base</code>
   </span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam">
    
    <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$cb</code>
   </span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam">
    
    <span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> <code class="parameter">$data</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">$flags</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">$backlog</code>
   </span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam">
    
    <span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> <code class="parameter">$target</code>
   </span><br>)</div>

  <p class="para rdfs-comment">
   Crea un nuevo oyente de conexión asociado con la base de eventos.
  </p>
 </div>

 <div class="refsect1 parameters" id="refsect1-eventlistener.construct-parameters">
  <h3 class="title">Parámetros</h3>
  <dl>
   
    <dt>
     <code class="parameter">base</code>
    </dt>
    <dd>
     <p class="para">
      Base de eventos asociada.
     </p>
    </dd>
   
   
    <dt>
     <code class="parameter">cb</code>
    </dt>
    <dd>
     <p class="para">
      Un <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> que será invocado cuando una
      nueva conexión sea recibida.
     </p>
    </dd>
   
   
    <dt>
     <code class="parameter">data</code>
    </dt>
    <dd>
     <p class="para">
      Datos de usuario personalizados adjuntos al parámetro
      <code class="parameter">cb</code>.
     </p>
    </dd>
   
   
    <dt>
     <code class="parameter">flags</code>
    </dt>
    <dd>
     <p class="para">
      Una máscara de constantes
      <code class="literal">EventListener::OPT_*</code>. Ver las
      <a href="class.eventlistener.php#eventlistener.constants" class="link">constantes EventListener</a>.
     </p>
    </dd>
   
   
    <dt>
     <code class="parameter">backlog</code>
    </dt>
    <dd>
     <p class="para">
      Controla el número máximo de conexiones en espera que la pila de red
      permite esperar en un estado &quot;aún no aceptado&quot;; ver la documentación
      de la función <code class="literal">listen</code> de su sistema para más
      detalles. Si el parámetro <code class="parameter">backlog</code> es negativo,
      Libevent intenta obtener un buen valor para este parámetro;
      si es cero, Event asume que la función del sistema <code class="literal">listen</code>
      ya ha sido llamada en el socket (<code class="parameter">target</code>).
     </p>
    </dd>
   
   
    <dt>
     <code class="parameter">target</code>
    </dt>
    <dd>
     <p class="para">
      Puede ser un string, un recurso de socket, o un flujo asociado con un socket. En el caso de que este parámetro sea un string, será analizado como dirección IP.
      Será analizado como socket de dominio UNIX si está prefijado
      por <code class="literal">&#039;unix:&#039;</code>, por ejemplo, <code class="literal">&#039;unix:/tmp/my.sock&#039;</code>.
     </p>
    </dd>
   
  </dl>
 </div>

 <div class="refsect1 changelog" id="refsect1-eventlistener.construct-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>PECL event 1.5.0</td>
      <td>
       Se añadió el soporte para sockets de dominio UNIX.
      </td>
     </tr>

    </tbody>
   
  </table>

 </div>

 <div class="refsect1 examples" id="refsect1-eventlistener.construct-examples">
  <h3 class="title">Ejemplos</h3>
  <div class="example" id="example-1">
   <p><strong>Ejemplo #1 
    Ejemplo con <span class="function"><strong>EventListener::__construct()</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">/*<br /> * Un simple servidor de eco, basado en un oyente de conexión libevent.<br /> *<br /> * Uso:<br /> * 1) En una terminal Windows, ejecute:<br /> *<br /> * $ php listener.php 9881<br /> *<br /> * 2) En otra terminal Windows, abra la siguiente conexión:<br /> *<br /> * $ nc 127.0.0.1 9881<br /> *<br /> * 3) Comience a escribir. El servidor debería repetir las entradas.<br /> */<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyListenerConnection </span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">free</span><span style="color: #007700">();<br />    }<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base </span><span style="color: #007700">= </span><span style="color: #0000BB">$base</span><span style="color: #007700">;<br /><br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bev </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">, </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_CLOSE_ON_FREE</span><span style="color: #007700">);<br /><br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setCallbacks</span><span style="color: #007700">(array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"echoReadCallback"</span><span style="color: #007700">), </span><span style="color: #0000BB">NULL</span><span style="color: #007700">,<br />            array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"echoEventCallback"</span><span style="color: #007700">), </span><span style="color: #0000BB">NULL</span><span style="color: #007700">);<br /><br />        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">enable</span><span style="color: #007700">(</span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">READ</span><span style="color: #007700">)) {<br />            echo </span><span style="color: #DD0000">"Imposible habilitar READ\n"</span><span style="color: #007700">;<br />            return;<br />        }<br />    }<br /><br />    public function </span><span style="color: #0000BB">echoReadCallback</span><span style="color: #007700">(</span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br />        </span><span style="color: #FF8000">// Copia todos los datos desde el buffer de entrada hacia el buffer de salida<br /><br />        // Variante #1<br />        </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">output</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">addBuffer</span><span style="color: #007700">(</span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">input</span><span style="color: #007700">);<br /><br />        </span><span style="color: #FF8000">/* Variante #2 */<br />        /*<br />        $input    = $bev-&gt;getInput();<br />        $output = $bev-&gt;getOutput();<br />        $output-&gt;addBuffer($input);<br />        */<br />    </span><span style="color: #007700">}<br /><br />    public function </span><span style="color: #0000BB">echoEventCallback</span><span style="color: #007700">(</span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$events</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br />        if (</span><span style="color: #0000BB">$events </span><span style="color: #007700">&amp; </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">ERROR</span><span style="color: #007700">) {<br />            echo </span><span style="color: #DD0000">"Error desde bufferevent\n"</span><span style="color: #007700">;<br />        }<br /><br />        if (</span><span style="color: #0000BB">$events </span><span style="color: #007700">&amp; (</span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">EOF </span><span style="color: #007700">| </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">ERROR</span><span style="color: #007700">)) {<br />            </span><span style="color: #FF8000">//$bev-&gt;free();<br />            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">__destruct</span><span style="color: #007700">();<br />        }<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">MyListener </span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$base</span><span style="color: #007700">,<br />        </span><span style="color: #0000BB">$listener</span><span style="color: #007700">,<br />        </span><span style="color: #0000BB">$socket</span><span style="color: #007700">;<br />    private </span><span style="color: #0000BB">$conn </span><span style="color: #007700">= array();<br /><br />    public function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {<br />        foreach (</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">conn </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$c</span><span style="color: #007700">) </span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$port</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();<br />        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base</span><span style="color: #007700">) {<br />            echo </span><span style="color: #DD0000">"Imposible abrir la base del evento"</span><span style="color: #007700">;<br />            exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />        }<br /><br />        </span><span style="color: #FF8000">// Variante #1<br />        /*<br />        $this-&gt;socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);<br />        if (!socket_bind($this-&gt;socket, '0.0.0.0', $port)) {<br />            echo "Imposible enlazar el socket\n";<br />            exit(1);<br />        }<br />        $this-&gt;listener = new EventListener($this-&gt;base,<br />            array($this, "acceptConnCallback"), $this-&gt;base,<br />            EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,<br />            -1, $this-&gt;socket);<br />         */<br /><br />        // Variante #2<br />         </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">listener </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventListener</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base</span><span style="color: #007700">,<br />             array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"acceptConnCallback"</span><span style="color: #007700">), </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base</span><span style="color: #007700">,<br />             </span><span style="color: #0000BB">EventListener</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_CLOSE_ON_FREE </span><span style="color: #007700">| </span><span style="color: #0000BB">EventListener</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_REUSEABLE</span><span style="color: #007700">, -</span><span style="color: #0000BB">1</span><span style="color: #007700">,<br />             </span><span style="color: #DD0000">"0.0.0.0:</span><span style="color: #0000BB">$port</span><span style="color: #DD0000">"</span><span style="color: #007700">);<br /><br />        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">listener</span><span style="color: #007700">) {<br />            echo </span><span style="color: #DD0000">"No se pudo crear el oyente"</span><span style="color: #007700">;<br />            exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />        }<br /><br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">listener</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setErrorCallback</span><span style="color: #007700">(array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"accept_error_cb"</span><span style="color: #007700">));<br />    }<br /><br />    public function </span><span style="color: #0000BB">dispatch</span><span style="color: #007700">() {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br />    }<br /><br />    </span><span style="color: #FF8000">// Esta función de retrollamada es llamada cuando hay datos para leer desde $bev<br />    </span><span style="color: #007700">public function </span><span style="color: #0000BB">acceptConnCallback</span><span style="color: #007700">(</span><span style="color: #0000BB">$listener</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">, </span><span style="color: #0000BB">$address</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br />        </span><span style="color: #FF8000">// ¡Tenemos una nueva conexión! Se le define un bufferevent. */<br />        </span><span style="color: #0000BB">$base </span><span style="color: #007700">= </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">conn</span><span style="color: #007700">[] = new </span><span style="color: #0000BB">MyListenerConnection</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">);<br />    }<br /><br />    public function </span><span style="color: #0000BB">accept_error_cb</span><span style="color: #007700">(</span><span style="color: #0000BB">$listener</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$base </span><span style="color: #007700">= </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base</span><span style="color: #007700">;<br /><br />        </span><span style="color: #0000BB">fprintf</span><span style="color: #007700">(</span><span style="color: #0000BB">STDERR</span><span style="color: #007700">, </span><span style="color: #DD0000">"Error recibido %d (%s) en el oyente. "<br />            </span><span style="color: #007700">.</span><span style="color: #DD0000">"Cerrando.\n"</span><span style="color: #007700">,<br />            </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketErrno</span><span style="color: #007700">(),<br />            </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketError</span><span style="color: #007700">());<br /><br />        </span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">9808</span><span style="color: #007700">;<br /><br />if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$port </span><span style="color: #007700">= (int) </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br />}<br />if (</span><span style="color: #0000BB">$port </span><span style="color: #007700">&lt;= </span><span style="color: #0000BB">0 </span><span style="color: #007700">|| </span><span style="color: #0000BB">$port </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">65535</span><span style="color: #007700">) {<br />    exit(</span><span style="color: #DD0000">"Puerto inválido"</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">$l </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyListener</span><span style="color: #007700">(</span><span style="color: #0000BB">$port</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$l</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

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