<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.event.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'event.examples.php',
    1 => 'Ejemplos',
    2 => 'Ejemplos',
  ),
  'up' => 
  array (
    0 => 'book.event.php',
    1 => 'Event',
  ),
  'prev' => 
  array (
    0 => 'event.installation.php',
    1 => 'Instalaci&oacute;n',
  ),
  'next' => 
  array (
    0 => 'event.flags.php',
    1 => 'Los flags de eventos',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/event/examples.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="event.examples" class="chapter">
 <h1 class="title">Ejemplos</h1>

 <div class="example" id="example-1">
  <p><strong>Ejemplo #1 Cliente HTTP simple</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">// Lectura de la función de retrollamada
</span><span style="color: #007700">function </span><span style="color: #0000BB">readcb</span><span style="color: #007700">(</span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">) {
    </span><span style="color: #FF8000">//$input = $bev-&gt;input; //$bev-&gt;getInput();

    //$pos = $input-&gt;search("TTP");
    </span><span style="color: #0000BB">$pos </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">-&gt;</span><span style="color: #0000BB">search</span><span style="color: #007700">(</span><span style="color: #DD0000">"TTP"</span><span style="color: #007700">);

    while ((</span><span style="color: #0000BB">$n </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">-&gt;</span><span style="color: #0000BB">remove</span><span style="color: #007700">(</span><span style="color: #0000BB">$buf</span><span style="color: #007700">, </span><span style="color: #0000BB">1024</span><span style="color: #007700">)) &gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">) {
        echo </span><span style="color: #0000BB">$buf</span><span style="color: #007700">;
    }
}

</span><span style="color: #FF8000">// Función de retrollamada del evento
</span><span style="color: #007700">function </span><span style="color: #0000BB">eventcb</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">$base</span><span style="color: #007700">) {
    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">CONNECTED</span><span style="color: #007700">) {
        echo </span><span style="color: #DD0000">"Conectado.\n"</span><span style="color: #007700">;
    } elseif (</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">| </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">EOF</span><span style="color: #007700">)) {
        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">) {
            echo </span><span style="color: #DD0000">"error DNS : "</span><span style="color: #007700">, </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getDnsErrorString</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
        }

        echo </span><span style="color: #DD0000">"Cierre\n"</span><span style="color: #007700">;
        </span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">exit</span><span style="color: #007700">();
        exit(</span><span style="color: #DD0000">"¡Hecho!\n"</span><span style="color: #007700">);
    }
}

if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">!= </span><span style="color: #0000BB">3</span><span style="color: #007700">) {
    echo &lt;&lt;&lt;EOS
</span><span style="color: #DD0000">Trivial HTTP 0.x client
Syntax: php </span><span style="color: #007700">{</span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]}</span><span style="color: #DD0000"> [hostname] [resource]
Example: php </span><span style="color: #007700">{</span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]}</span><span style="color: #DD0000"> www.google.com /

</span><span style="color: #007700">EOS;
    exit();
}

</span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();

</span><span style="color: #0000BB">$dns_base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventDnsBase</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">TRUE</span><span style="color: #007700">); </span><span style="color: #FF8000">// Se utiliza una resolución DNS asíncrona
</span><span style="color: #007700">if (!</span><span style="color: #0000BB">$dns_base</span><span style="color: #007700">) {
    exit(</span><span style="color: #DD0000">"Fallo en la inicialización de la base DNS\n"</span><span style="color: #007700">);
}

</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: #FF8000">/* use internal socket */ </span><span style="color: #0000BB">NULL</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">| </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_DEFER_CALLBACKS</span><span style="color: #007700">,
    </span><span style="color: #DD0000">"readcb"</span><span style="color: #007700">, </span><span style="color: #FF8000">/* writecb */ </span><span style="color: #0000BB">NULL</span><span style="color: #007700">, </span><span style="color: #DD0000">"eventcb"
</span><span style="color: #007700">);
if (!</span><span style="color: #0000BB">$bev</span><span style="color: #007700">) {
    exit(</span><span style="color: #DD0000">"Fallo en la creación del socket bufferevent\n"</span><span style="color: #007700">);
}

</span><span style="color: #FF8000">//$bev-&gt;setCallbacks("readcb", /* writecb */ NULL, "eventcb", $base);
</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">| </span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">WRITE</span><span style="color: #007700">);

</span><span style="color: #0000BB">$output </span><span style="color: #007700">= </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">output</span><span style="color: #007700">; </span><span style="color: #FF8000">//$bev-&gt;getOutput();
</span><span style="color: #007700">if (!</span><span style="color: #0000BB">$output</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">add</span><span style="color: #007700">(
    </span><span style="color: #DD0000">"GET </span><span style="color: #007700">{</span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">]}</span><span style="color: #DD0000"> HTTP/1.0\r\n"</span><span style="color: #007700">.
    </span><span style="color: #DD0000">"Host: </span><span style="color: #007700">{</span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]}</span><span style="color: #DD0000">\r\n"</span><span style="color: #007700">.
    </span><span style="color: #DD0000">"Connection: Close\r\n\r\n"
</span><span style="color: #007700">)) {
    exit(</span><span style="color: #DD0000">"Fallo en la adición de la petición en el buffer de salida\n"</span><span style="color: #007700">);
}

if (!</span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connectHost</span><span style="color: #007700">(</span><span style="color: #0000BB">$dns_base</span><span style="color: #007700">, </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">], </span><span style="color: #0000BB">80</span><span style="color: #007700">, </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">AF_UNSPEC</span><span style="color: #007700">)) {
    exit(</span><span style="color: #DD0000">"Conexión imposible al host </span><span style="color: #007700">{</span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]}</span><span style="color: #DD0000">\n"</span><span style="color: #007700">);
}

</span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

  <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
  <div class="example-contents screen">
<div class="cdata"><pre>
Connected.
HTTP/1.1 301 Moved Permanently
Date: Fri, 01 Mar 2013 18:47:48 GMT
Location: http://www.google.co.uk/
Content-Type: text/html; charset=UTF-8
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 221
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Age: 133438
Expires: Sat, 30 Mar 2013 05:39:28 GMT
Connection: close

&lt;HTML&gt;&lt;HEAD&gt;&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html;charset=utf-8&quot;&gt;
&lt;TITLE&gt;301 Moved&lt;/TITLE&gt;&lt;/HEAD&gt;&lt;BODY&gt;
&lt;H1&gt;301 Moved&lt;/H1&gt;
The document has moved
&lt;A HREF=&quot;http://www.google.co.uk/&quot;&gt;here&lt;/A&gt;.
&lt;/BODY&gt;&lt;/HTML&gt;
Closing
Done
</pre></div>
  </div>
 </div>
 <div class="example" id="example-2">
  <p><strong>Ejemplo #2 Cliente HTTP utilizando una resolución DNS asíncrona</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/*
 * 1. Conexión a 127.0.0.1 en el puerto 80
 * utilizando EventBufferEvent::connect().
 *
 * 2. Petición /index.cphp vía HTTP/1.0
 * utilizando el buffer de salida.
 *
 * 3. Lee la respuesta de forma asíncrona y la muestra en stdout.
 */

// Lectura de la función de retrollamada
</span><span style="color: #007700">function </span><span style="color: #0000BB">readcb</span><span style="color: #007700">(</span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">) {
    </span><span style="color: #0000BB">$input </span><span style="color: #007700">= </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getInput</span><span style="color: #007700">();

    while ((</span><span style="color: #0000BB">$n </span><span style="color: #007700">= </span><span style="color: #0000BB">$input</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">remove</span><span style="color: #007700">(</span><span style="color: #0000BB">$buf</span><span style="color: #007700">, </span><span style="color: #0000BB">1024</span><span style="color: #007700">)) &gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">) {
        echo </span><span style="color: #0000BB">$buf</span><span style="color: #007700">;
    }
}

</span><span style="color: #FF8000">// Función de retrollamada del evento
</span><span style="color: #007700">function </span><span style="color: #0000BB">eventcb</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">$base</span><span style="color: #007700">) {
    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">CONNECTED</span><span style="color: #007700">) {
        echo </span><span style="color: #DD0000">"Conectado.\n"</span><span style="color: #007700">;
    } elseif (</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">| </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">EOF</span><span style="color: #007700">)) {
        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">) {
            echo </span><span style="color: #DD0000">"Error DNS : "</span><span style="color: #007700">, </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getDnsErrorString</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
        }

        echo </span><span style="color: #DD0000">"Cierre\n"</span><span style="color: #007700">;
        </span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">exit</span><span style="color: #007700">();
        exit(</span><span style="color: #DD0000">"¡Hecho!\n"</span><span style="color: #007700">);
    }
}

</span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();

echo </span><span style="color: #DD0000">"paso n°1\n"</span><span style="color: #007700">;
</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: #FF8000">/* use internal socket */ </span><span style="color: #0000BB">NULL</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">| </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_DEFER_CALLBACKS</span><span style="color: #007700">);
if (!</span><span style="color: #0000BB">$bev</span><span style="color: #007700">) {
    exit(</span><span style="color: #DD0000">"Fallo en la creación del socket bufferevent\n"</span><span style="color: #007700">);
}

echo </span><span style="color: #DD0000">"paso n°2\n"</span><span style="color: #007700">;
</span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setCallbacks</span><span style="color: #007700">(</span><span style="color: #DD0000">"readcb"</span><span style="color: #007700">, </span><span style="color: #FF8000">/* writecb */ </span><span style="color: #0000BB">NULL</span><span style="color: #007700">, </span><span style="color: #DD0000">"eventcb"</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">);
</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">| </span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">WRITE</span><span style="color: #007700">);

echo </span><span style="color: #DD0000">"paso n°3\n"</span><span style="color: #007700">;
</span><span style="color: #FF8000">// Envío de la petición
</span><span style="color: #0000BB">$output </span><span style="color: #007700">= </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getOutput</span><span style="color: #007700">();
if (!</span><span style="color: #0000BB">$output</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">add</span><span style="color: #007700">(
    </span><span style="color: #DD0000">"GET /index.cphp HTTP/1.0\r\n"</span><span style="color: #007700">.
    </span><span style="color: #DD0000">"Connection: Close\r\n\r\n"
</span><span style="color: #007700">)) {
    exit(</span><span style="color: #DD0000">"Fallo en la adición de la petición en el buffer de salida\n"</span><span style="color: #007700">);
}

</span><span style="color: #FF8000">/* Conexión al host de forma síncrona.
Conocemos la IP, por lo que no se necesita resolución DNS. */
</span><span style="color: #007700">if (!</span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connect</span><span style="color: #007700">(</span><span style="color: #DD0000">"127.0.0.1:80"</span><span style="color: #007700">)) {
    exit(</span><span style="color: #DD0000">"Imposible conectar al host\n"</span><span style="color: #007700">);
}

</span><span style="color: #FF8000">// Difunde los eventos pendientes
</span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

 </div>
 <div class="example" id="example-3">

   <p><strong>Ejemplo #3 Servidor de visualización</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/*
 * Servidor de visualización simple basado en las escuchas de conexión libevent.
 *
 * Uso:
 * 1) En un terminal, ejecute:
 *
 * $ php listener.php 9881
 *
 * 2) En otro terminal, abra una conexión, i.e. :
 *
 * $ nc 127.0.0.1 9881
 *
 * 3) Comience a escribir. El servidor debería repetir las entradas.
 */

</span><span style="color: #007700">class </span><span style="color: #0000BB">MyListenerConnection </span><span style="color: #007700">{
    private </span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">;

    public function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {
        </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">();
    }

    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">) {
        </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">;

        </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">);

        </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">,
            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">);

        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">)) {
            echo </span><span style="color: #DD0000">"Fallo en la activación de READ\n"</span><span style="color: #007700">;
            return;
        }
    }

    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">) {
        </span><span style="color: #FF8000">// Copia todos los datos desde el buffer de entrada hacia el buffer de salida

        // Variante #1
        </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">);

        </span><span style="color: #FF8000">/* Variante #2 */
        /*
        $input    = $bev-&gt;getInput();
        $output = $bev-&gt;getOutput();
        $output-&gt;addBuffer($input);
        */
    </span><span style="color: #007700">}

    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">) {
        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">) {
            echo </span><span style="color: #DD0000">"Error desde bufferevent\n"</span><span style="color: #007700">;
        }

        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">)) {
            </span><span style="color: #FF8000">//$bev-&gt;free();
            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">__destruct</span><span style="color: #007700">();
        }
    }
}

class </span><span style="color: #0000BB">MyListener </span><span style="color: #007700">{
    public </span><span style="color: #0000BB">$base</span><span style="color: #007700">,
        </span><span style="color: #0000BB">$listener</span><span style="color: #007700">,
        </span><span style="color: #0000BB">$socket</span><span style="color: #007700">;
    private </span><span style="color: #0000BB">$conn </span><span style="color: #007700">= array();

    public function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {
        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">;
    }

    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$port</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">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();
        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base</span><span style="color: #007700">) {
            echo </span><span style="color: #DD0000">"Imposible abrir la base del evento"</span><span style="color: #007700">;
            exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);
        }

        </span><span style="color: #FF8000">// Variante #1
        /*
        $this-&gt;socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if (!socket_bind($this-&gt;socket, '0.0.0.0', $port)) {
            echo "Imposible enlazar el socket\n";
            exit(1);
        }
        $this-&gt;listener = new EventListener($this-&gt;base,
            array($this, "acceptConnCallback"), $this-&gt;base,
            EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,
            -1, $this-&gt;socket);
         */

        // Variante #2
         </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">,
             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">,
             </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">,
             </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">);

        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">listener</span><span style="color: #007700">) {
            echo </span><span style="color: #DD0000">"Imposible crear el oyente"</span><span style="color: #007700">;
            exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);
        }

        </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">));
    }

    public function </span><span style="color: #0000BB">dispatch</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">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();
    }

    </span><span style="color: #FF8000">// Esta función de retrollamada es llamada cuando hay datos para leer en $bev
    </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">) {
        </span><span style="color: #FF8000">// ¡Tenemos una nueva conexión! Se define un bufferevent para ella. */
        </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">;
        </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">);
    }

    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">) {
        </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">;

        </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">"Se recibe un error %d (%s) en el oyente. "
            </span><span style="color: #007700">.</span><span style="color: #DD0000">"Cerrando.\n"</span><span style="color: #007700">,
            </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketErrno</span><span style="color: #007700">(),
            </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketError</span><span style="color: #007700">());

        </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">);
    }
}

</span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">9808</span><span style="color: #007700">;

if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">) {
    </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">];
}
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">) {
    exit(</span><span style="color: #DD0000">"Puerto inválido"</span><span style="color: #007700">);
}

</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">);
</span><span style="color: #0000BB">$l</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

 </div>
 <div class="example" id="example-4">
  <p><strong>Ejemplo #4 Servidor de visualización SSL</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/*
 * Servidor de visualización SSL
 *
 * Para probar:
 * 1) Ejecute:
 * $ php examples/ssl-echo-server/server.php 9998
 *
 * 2) en otro terminal, ejecute:
 * $ socat - SSL:127.0.0.1:9998,verify=1,cafile=examples/ssl-echo-server/cert.pem
 */

</span><span style="color: #007700">class </span><span style="color: #0000BB">MySslEchoServer </span><span style="color: #007700">{
    public </span><span style="color: #0000BB">$port</span><span style="color: #007700">,
        </span><span style="color: #0000BB">$base</span><span style="color: #007700">,
        </span><span style="color: #0000BB">$bev</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">;

    function </span><span style="color: #0000BB">__construct </span><span style="color: #007700">(</span><span style="color: #0000BB">$port</span><span style="color: #007700">, </span><span style="color: #0000BB">$host </span><span style="color: #007700">= </span><span style="color: #DD0000">"127.0.0.1"</span><span style="color: #007700">) {
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">port </span><span style="color: #007700">= </span><span style="color: #0000BB">$port</span><span style="color: #007700">;
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ctx </span><span style="color: #007700">= </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">init_ssl</span><span style="color: #007700">();
        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ctx</span><span style="color: #007700">) {
            exit(</span><span style="color: #DD0000">"Fallo en la creación del contexto SSL\n"</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">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();
        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base</span><span style="color: #007700">) {
            exit(</span><span style="color: #DD0000">"Imposible abrir la base del evento\n"</span><span style="color: #007700">);
        }

        </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">,
            array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"ssl_accept_cb"</span><span style="color: #007700">), </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ctx</span><span style="color: #007700">,
            </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">, </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$host</span><span style="color: #DD0000">:</span><span style="color: #0000BB">$port</span><span style="color: #DD0000">"</span><span style="color: #007700">);
        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">listener</span><span style="color: #007700">) {
            exit(</span><span style="color: #DD0000">"Imposible crear el oyente\n"</span><span style="color: #007700">);
        }

        </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">));
    }
    function </span><span style="color: #0000BB">dispatch</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">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();
    }

    </span><span style="color: #FF8000">// Esta función de retrollamada es llamada cuando hay datos para leer en $bev.
    </span><span style="color: #007700">function </span><span style="color: #0000BB">ssl_read_cb</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">) {
        </span><span style="color: #0000BB">$in </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">; </span><span style="color: #FF8000">//$bev-&gt;getInput();

        </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"Recepción de %zu bytes\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">$in</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">length</span><span style="color: #007700">);
        </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"----- datos ----\n"</span><span style="color: #007700">);
        </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"%ld:\t%s\n"</span><span style="color: #007700">, (int) </span><span style="color: #0000BB">$in</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">length</span><span style="color: #007700">, </span><span style="color: #0000BB">$in</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pullup</span><span style="color: #007700">(-</span><span style="color: #0000BB">1</span><span style="color: #007700">));

        </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">writeBuffer</span><span style="color: #007700">(</span><span style="color: #0000BB">$in</span><span style="color: #007700">);
    }

    </span><span style="color: #FF8000">// Esta función de retrollamada es llamada cuando ocurren errores en el oyente de eventos,
    // i.e. la conexión se cierra, o ocurre un error
    </span><span style="color: #007700">function </span><span style="color: #0000BB">ssl_event_cb</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">) {
        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">) {
            </span><span style="color: #FF8000">// Recupera los errores desde la pila de errores SSL
            </span><span style="color: #007700">while (</span><span style="color: #0000BB">$err </span><span style="color: #007700">= </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sslError</span><span style="color: #007700">()) {
                </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 Bufferevent %s.\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">$err</span><span style="color: #007700">);
            }
        }

        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">)) {
            </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">free</span><span style="color: #007700">();
        }
    }

    </span><span style="color: #FF8000">// Esta función de retrollamada es llamada cuando un cliente acepta una nueva conexión
    </span><span style="color: #007700">function </span><span style="color: #0000BB">ssl_accept_cb</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">) {
        </span><span style="color: #FF8000">// ¡Tenemos una nueva conexión! Se define un bufferevent para ella.
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bev </span><span style="color: #007700">= </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">sslSocket</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">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">, </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ctx</span><span style="color: #007700">,
            </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">SSL_ACCEPTING</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">);

        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bev</span><span style="color: #007700">) {
            echo </span><span style="color: #DD0000">"Fallo en la creación del buffer SSL\n"</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">-&gt;</span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);
            exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);
        }

        </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">);
        </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">"ssl_read_cb"</span><span style="color: #007700">), </span><span style="color: #0000BB">NULL</span><span style="color: #007700">,
            array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"ssl_event_cb"</span><span style="color: #007700">), </span><span style="color: #0000BB">NULL</span><span style="color: #007700">);
    }

    </span><span style="color: #FF8000">// Esta función de retrollamada es llamada cuando se falla en definir una nueva conexión para un cliente
    </span><span style="color: #007700">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">) {
        </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">"Se recibe un error %d (%s) en el oyente. "
            </span><span style="color: #007700">.</span><span style="color: #DD0000">"Cerrando.\n"</span><span style="color: #007700">,
            </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketErrno</span><span style="color: #007700">(),
            </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketError</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">-&gt;</span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);
    }

    </span><span style="color: #FF8000">// Inicializa las estructuras SSL; crea un EventSslContext
    // Opcionalmente, crea certificados autofirmados
    </span><span style="color: #007700">function </span><span style="color: #0000BB">init_ssl</span><span style="color: #007700">() {
        </span><span style="color: #FF8000">// Necesitamos la entropía. De lo contrario, no tiene sentido cifrar.
        </span><span style="color: #007700">if (!</span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">sslRandPoll</span><span style="color: #007700">()) {
            exit(</span><span style="color: #DD0000">"Fallo de EventUtil::sslRandPoll\n"</span><span style="color: #007700">);
        }

        </span><span style="color: #0000BB">$local_cert </span><span style="color: #007700">= </span><span style="color: #0000BB">__DIR__</span><span style="color: #007700">.</span><span style="color: #DD0000">"/cert.pem"</span><span style="color: #007700">;
        </span><span style="color: #0000BB">$local_pk   </span><span style="color: #007700">= </span><span style="color: #0000BB">__DIR__</span><span style="color: #007700">.</span><span style="color: #DD0000">"/privkey.pem"</span><span style="color: #007700">;

        if (!</span><span style="color: #0000BB">file_exists</span><span style="color: #007700">(</span><span style="color: #0000BB">$local_cert</span><span style="color: #007700">) || !</span><span style="color: #0000BB">file_exists</span><span style="color: #007700">(</span><span style="color: #0000BB">$local_pk</span><span style="color: #007700">)) {
            echo </span><span style="color: #DD0000">"Imposible leer </span><span style="color: #0000BB">$local_cert</span><span style="color: #DD0000"> ni </span><span style="color: #0000BB">$local_pk</span><span style="color: #DD0000"> archivo. Para generar una clave\n"</span><span style="color: #007700">,
                </span><span style="color: #DD0000">"y un certificado autofirmado, ejecute :\n"</span><span style="color: #007700">,
                </span><span style="color: #DD0000">"  openssl genrsa -out </span><span style="color: #0000BB">$local_pk</span><span style="color: #DD0000"> 2048\n"</span><span style="color: #007700">,
                </span><span style="color: #DD0000">"  openssl req -new -key </span><span style="color: #0000BB">$local_pk</span><span style="color: #DD0000"> -out cert.req\n"</span><span style="color: #007700">,
                </span><span style="color: #DD0000">"  openssl x509 -req -days 365 -in cert.req -signkey </span><span style="color: #0000BB">$local_pk</span><span style="color: #DD0000"> -out </span><span style="color: #0000BB">$local_cert</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;

            return </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">;
        }

        </span><span style="color: #0000BB">$ctx </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">(</span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">SSLv3_SERVER_METHOD</span><span style="color: #007700">, array (
             </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_LOCAL_CERT  </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$local_cert</span><span style="color: #007700">,
             </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_LOCAL_PK    </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$local_pk</span><span style="color: #007700">,
             </span><span style="color: #FF8000">//EventSslContext::OPT_PASSPHRASE  =&gt; "echo server",
             </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_VERIFY_PEER </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true</span><span style="color: #007700">,
             </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_ALLOW_SELF_SIGNED </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">false</span><span style="color: #007700">,
        ));

        return </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">;
    }
}

</span><span style="color: #FF8000">// Permite el sobrescrito del puerto
</span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">9999</span><span style="color: #007700">;
if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">) {
    </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">];
}
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">) {
    exit(</span><span style="color: #DD0000">"Puerto inválido\n"</span><span style="color: #007700">);
}

</span><span style="color: #0000BB">$l </span><span style="color: #007700">= new </span><span style="color: #0000BB">MySslEchoServer</span><span style="color: #007700">(</span><span style="color: #0000BB">$port</span><span style="color: #007700">);
</span><span style="color: #0000BB">$l</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

 </div>
 <div class="example" id="example-5">
  <p><strong>Ejemplo #5 Manejador de señal</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/*
En un terminal, ejecute:

$ php examples/signal.php

En otro terminal, encuentre el pid y envíe la señal SIGTERM, i.e. :

$ ps aux | grep examp
ruslan    3976  0.2  0.0 139896 11256 pts/1    S+   10:25   0:00 php examples/signal.php
ruslan    3978  0.0  0.0   9572   864 pts/2    S+   10:26   0:00 grep --color=auto examp
$ kill -TERM 3976

En el primer terminal, debería capturar lo siguiente:

Se captura la señal 15
*/
</span><span style="color: #007700">class </span><span style="color: #0000BB">MyEventSignal </span><span style="color: #007700">{
    private </span><span style="color: #0000BB">$base</span><span style="color: #007700">;

    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">$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">;
    }

    function </span><span style="color: #0000BB">eventSighandler</span><span style="color: #007700">(</span><span style="color: #0000BB">$no</span><span style="color: #007700">, </span><span style="color: #0000BB">$c</span><span style="color: #007700">) {
        echo </span><span style="color: #DD0000">"Se captura la señal </span><span style="color: #0000BB">$no</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;
        </span><span style="color: #0000BB">event_base_loopexit</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</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">= </span><span style="color: #0000BB">event_base_new</span><span style="color: #007700">();
</span><span style="color: #0000BB">$c    </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyEventSignal</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">);
</span><span style="color: #0000BB">$no   </span><span style="color: #007700">= </span><span style="color: #0000BB">SIGTERM</span><span style="color: #007700">;
</span><span style="color: #0000BB">$ev   </span><span style="color: #007700">= </span><span style="color: #0000BB">evsignal_new</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$no</span><span style="color: #007700">, array(</span><span style="color: #0000BB">$c</span><span style="color: #007700">,</span><span style="color: #DD0000">'eventSighandler'</span><span style="color: #007700">), </span><span style="color: #0000BB">$c</span><span style="color: #007700">);

</span><span style="color: #0000BB">evsignal_add</span><span style="color: #007700">(</span><span style="color: #0000BB">$ev</span><span style="color: #007700">);

</span><span style="color: #0000BB">event_base_loop</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">);
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

 </div>
 <div class="example" id="example-6">
  <p><strong>Ejemplo #6 Uso de un bucle libevent para realizar las peticiones de la extensión `eio&#039;</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">// Función de retrollamada para eio_nop()
</span><span style="color: #007700">function </span><span style="color: #0000BB">my_nop_cb</span><span style="color: #007700">(</span><span style="color: #0000BB">$d</span><span style="color: #007700">, </span><span style="color: #0000BB">$r</span><span style="color: #007700">) {
    echo </span><span style="color: #DD0000">"paso 6\n"</span><span style="color: #007700">;
}

</span><span style="color: #0000BB">$dir </span><span style="color: #007700">= </span><span style="color: #DD0000">"/tmp/abc-eio-temp"</span><span style="color: #007700">;
if (</span><span style="color: #0000BB">file_exists</span><span style="color: #007700">(</span><span style="color: #0000BB">$dir</span><span style="color: #007700">)) {
    </span><span style="color: #0000BB">rmdir</span><span style="color: #007700">(</span><span style="color: #0000BB">$dir</span><span style="color: #007700">);
}

echo </span><span style="color: #DD0000">"paso 1\n"</span><span style="color: #007700">;

</span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();

echo </span><span style="color: #DD0000">"paso 2\n"</span><span style="color: #007700">;

</span><span style="color: #0000BB">eio_init</span><span style="color: #007700">();

</span><span style="color: #0000BB">eio_mkdir</span><span style="color: #007700">(</span><span style="color: #0000BB">$dir</span><span style="color: #007700">, </span><span style="color: #0000BB">0750</span><span style="color: #007700">, </span><span style="color: #0000BB">EIO_PRI_DEFAULT</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_nop_cb"</span><span style="color: #007700">);

</span><span style="color: #0000BB">$event </span><span style="color: #007700">= new </span><span style="color: #0000BB">Event</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">eio_get_event_stream</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">| </span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">PERSIST</span><span style="color: #007700">, function (</span><span style="color: #0000BB">$fd</span><span style="color: #007700">, </span><span style="color: #0000BB">$events</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">) {
    echo </span><span style="color: #DD0000">"paso 5\n"</span><span style="color: #007700">;

    while (</span><span style="color: #0000BB">eio_nreqs</span><span style="color: #007700">()) {
        </span><span style="color: #0000BB">eio_poll</span><span style="color: #007700">();
    }

    </span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">stop</span><span style="color: #007700">();
}, </span><span style="color: #0000BB">$base</span><span style="color: #007700">);

echo </span><span style="color: #DD0000">"paso 3\n"</span><span style="color: #007700">;

</span><span style="color: #0000BB">$event</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">add</span><span style="color: #007700">();

echo </span><span style="color: #DD0000">"paso 4\n"</span><span style="color: #007700">;

</span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();

echo </span><span style="color: #DD0000">"¡Hecho!\n"</span><span style="color: #007700">;
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

 </div>
 <div class="example" id="example-7">
  <p><strong>Ejemplo #7 Diversos</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/* {{{ Configuración y métodos soportados */
</span><span style="color: #007700">echo </span><span style="color: #DD0000">"Métodos soportados :\n"</span><span style="color: #007700">;
foreach (</span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">getSupportedMethods</span><span style="color: #007700">() as </span><span style="color: #0000BB">$m</span><span style="color: #007700">) {
    echo </span><span style="color: #0000BB">$m</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
}

</span><span style="color: #FF8000">// Se desactiva el método "select"
</span><span style="color: #0000BB">$cfg </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventConfig</span><span style="color: #007700">();
if (</span><span style="color: #0000BB">$cfg</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">avoidMethod</span><span style="color: #007700">(</span><span style="color: #DD0000">"select"</span><span style="color: #007700">)) {
    echo </span><span style="color: #DD0000">"El método 'select' ha sido desactivado\n"</span><span style="color: #007700">;
}

</span><span style="color: #FF8000">// Crea un event_base asociado a la configuración
</span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">(</span><span style="color: #0000BB">$cfg</span><span style="color: #007700">);
echo </span><span style="color: #DD0000">"Método de evento utilizado : "</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMethod</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;

echo </span><span style="color: #DD0000">"Características :\n"</span><span style="color: #007700">;
</span><span style="color: #0000BB">$features </span><span style="color: #007700">= </span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getFeatures</span><span style="color: #007700">();
(</span><span style="color: #0000BB">$features </span><span style="color: #007700">&amp; </span><span style="color: #0000BB">EventConfig</span><span style="color: #007700">::</span><span style="color: #0000BB">FEATURE_ET</span><span style="color: #007700">) and print </span><span style="color: #DD0000">"ET - edge-triggered IO\n"</span><span style="color: #007700">;
(</span><span style="color: #0000BB">$features </span><span style="color: #007700">&amp; </span><span style="color: #0000BB">EventConfig</span><span style="color: #007700">::</span><span style="color: #0000BB">FEATURE_O1</span><span style="color: #007700">) and print </span><span style="color: #DD0000">"O1 - O(1) operation for adding/deleting events\n"</span><span style="color: #007700">;
(</span><span style="color: #0000BB">$features </span><span style="color: #007700">&amp; </span><span style="color: #0000BB">EventConfig</span><span style="color: #007700">::</span><span style="color: #0000BB">FEATURE_FDS</span><span style="color: #007700">) and print </span><span style="color: #DD0000">"FDS - arbitrary file descriptor types, and not just sockets\n"</span><span style="color: #007700">;

</span><span style="color: #FF8000">// Requiere la característica FDS
</span><span style="color: #007700">if (</span><span style="color: #0000BB">$cfg</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">requireFeatures</span><span style="color: #007700">(</span><span style="color: #0000BB">EventConfig</span><span style="color: #007700">::</span><span style="color: #0000BB">FEATURE_FDS</span><span style="color: #007700">)) {
    echo </span><span style="color: #DD0000">"La característica FDS es ahora requerida\n"</span><span style="color: #007700">;

    </span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">(</span><span style="color: #0000BB">$cfg</span><span style="color: #007700">);
    (</span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getFeatures</span><span style="color: #007700">() &amp; </span><span style="color: #0000BB">EventConfig</span><span style="color: #007700">::</span><span style="color: #0000BB">FEATURE_FDS</span><span style="color: #007700">)
        and print </span><span style="color: #DD0000">"FDS - tipo de descriptor de archivo arbitrario, y no solo los sockets\n"</span><span style="color: #007700">;
}
</span><span style="color: #FF8000">/* }}} */

/* {{{ Base */
</span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();
</span><span style="color: #0000BB">$event </span><span style="color: #007700">= new </span><span style="color: #0000BB">Event</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">STDIN</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">| </span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">PERSIST</span><span style="color: #007700">, function (</span><span style="color: #0000BB">$fd</span><span style="color: #007700">, </span><span style="color: #0000BB">$events</span><span style="color: #007700">, </span><span style="color: #0000BB">$arg</span><span style="color: #007700">) {
    static </span><span style="color: #0000BB">$max_iterations </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;

    if (++</span><span style="color: #0000BB">$max_iterations </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">5</span><span style="color: #007700">) {
        </span><span style="color: #FF8000">/* se sale después de 5 iteraciones con un tiempo máximo de espera de 2.33 segundos */
        </span><span style="color: #007700">echo </span><span style="color: #DD0000">"Detención...\n"</span><span style="color: #007700">;
        </span><span style="color: #0000BB">$arg</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]-&gt;</span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">2.33</span><span style="color: #007700">);
    }

    echo </span><span style="color: #0000BB">fgets</span><span style="color: #007700">(</span><span style="color: #0000BB">$fd</span><span style="color: #007700">);
}, array (&amp;</span><span style="color: #0000BB">$base</span><span style="color: #007700">));

</span><span style="color: #0000BB">$event</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">add</span><span style="color: #007700">();
</span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">loop</span><span style="color: #007700">();
</span><span style="color: #FF8000">/* Base }}} */
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

 </div>
 <div class="example" id="example-8">
  <p><strong>Ejemplo #8 Servidor HTTP simple</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/*
 * Servidor HTTP simple.
 *
 * Para probarlo:
 * 1) Ejecútelo en el puerto de su elección, i.e. :
 * $ php examples/http.php 8010
 * 2) En otro terminal, conéctese a una dirección de este puerto
 * y realice peticiones GET o POST (los otros tipos están desactivados en este ejemplo), i.e. :
 * $ nc -t 127.0.0.1 8010
 * POST /about HTTP/1.0
 * Content-Type: text/plain
 * Content-Length: 4
 * Connection: close
 * (presione Enter)
 *
 * Debería mostrar:
 * a=12
 * HTTP/1.0 200 OK
 * Content-Type: text/html; charset=ISO-8859-1
 * Connection: close
 *
 * $ nc -t 127.0.0.1 8010
 * GET /dump HTTP/1.0
 * Content-Type: text/plain
 * Content-Encoding: UTF-8
 * Connection: close
 * (presione Enter)
 *
 * Debería mostrar:
 * HTTP/1.0 200 OK
 * Content-Type: text/html; charset=ISO-8859-1
 * Connection: close
 *
 * $ nc -t 127.0.0.1 8010
 * GET /unknown HTTP/1.0
 * Connection: close
 *
 * Debería mostrar:
 * HTTP/1.0 200 OK
 * Content-Type: text/html; charset=ISO-8859-1
 * Connection: close
 *
 * 3) Ver lo que el servidor muestra en el terminal anterior.
 */

</span><span style="color: #007700">function </span><span style="color: #0000BB">_http_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">) {
    static </span><span style="color: #0000BB">$counter      </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;
    static </span><span style="color: #0000BB">$max_requests </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;

    if (++</span><span style="color: #0000BB">$counter </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">$max_requests</span><span style="color: #007700">)  {
        echo </span><span style="color: #DD0000">"El contador ha alcanzado el número máximo de peticiones (</span><span style="color: #0000BB">$max_requests</span><span style="color: #DD0000">). ¡Salida!\n"</span><span style="color: #007700">;
        exit();
    }

    echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #DD0000">" llamada\n"</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"Petición :"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">);
    echo </span><span style="color: #DD0000">"Datos :"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">);

    echo </span><span style="color: #DD0000">"\n===== DUMP =====\n"</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"Comando :"</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getCommand</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"URI :"</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getUri</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"Encabezados de entrada :"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getInputHeaders</span><span style="color: #007700">());
    echo </span><span style="color: #DD0000">"Encabezados de salida :"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getOutputHeaders</span><span style="color: #007700">());

    echo </span><span style="color: #DD0000">"\n &gt;&gt; Enviando la respuesta ..."</span><span style="color: #007700">;
    </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sendReply</span><span style="color: #007700">(</span><span style="color: #0000BB">200</span><span style="color: #007700">, </span><span style="color: #DD0000">"OK"</span><span style="color: #007700">);
    echo </span><span style="color: #DD0000">"OK\n"</span><span style="color: #007700">;

    echo </span><span style="color: #DD0000">"\n &gt;&gt; Lectura del buffer de entrada ...\n"</span><span style="color: #007700">;
    </span><span style="color: #0000BB">$buf </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getInputBuffer</span><span style="color: #007700">();
    while (</span><span style="color: #0000BB">$s </span><span style="color: #007700">= </span><span style="color: #0000BB">$buf</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">readLine</span><span style="color: #007700">(</span><span style="color: #0000BB">EventBuffer</span><span style="color: #007700">::</span><span style="color: #0000BB">EOL_ANY</span><span style="color: #007700">)) {
        echo </span><span style="color: #0000BB">$s</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    }
    echo </span><span style="color: #DD0000">"No hay más datos en el buffer\n"</span><span style="color: #007700">;
}

function </span><span style="color: #0000BB">_http_about</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">) {
    echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"URI : "</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getUri</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"\n &gt;&gt; Enviando la respuesta ..."</span><span style="color: #007700">;
    </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sendReply</span><span style="color: #007700">(</span><span style="color: #0000BB">200</span><span style="color: #007700">, </span><span style="color: #DD0000">"OK"</span><span style="color: #007700">);
    echo </span><span style="color: #DD0000">"OK\n"</span><span style="color: #007700">;
}

function </span><span style="color: #0000BB">_http_default</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">) {
    echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"URI: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getUri</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"\n &gt;&gt; Enviando la respuesta ..."</span><span style="color: #007700">;
    </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sendReply</span><span style="color: #007700">(</span><span style="color: #0000BB">200</span><span style="color: #007700">, </span><span style="color: #DD0000">"OK"</span><span style="color: #007700">);
    echo </span><span style="color: #DD0000">"OK\n"</span><span style="color: #007700">;
}

</span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">8010</span><span style="color: #007700">;
if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">) {
    </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">];
}
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">) {
    exit(</span><span style="color: #DD0000">"Puerto inválido"</span><span style="color: #007700">);
}

</span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();
</span><span style="color: #0000BB">$http </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventHttp</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">);
</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setAllowedMethods</span><span style="color: #007700">(</span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">::</span><span style="color: #0000BB">CMD_GET </span><span style="color: #007700">| </span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">::</span><span style="color: #0000BB">CMD_POST</span><span style="color: #007700">);

</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setCallback</span><span style="color: #007700">(</span><span style="color: #DD0000">"/dump"</span><span style="color: #007700">, </span><span style="color: #DD0000">"_http_dump"</span><span style="color: #007700">, array(</span><span style="color: #0000BB">4</span><span style="color: #007700">, </span><span style="color: #0000BB">8</span><span style="color: #007700">));
</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setCallback</span><span style="color: #007700">(</span><span style="color: #DD0000">"/about"</span><span style="color: #007700">, </span><span style="color: #DD0000">"_http_about"</span><span style="color: #007700">);
</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setDefaultCallback</span><span style="color: #007700">(</span><span style="color: #DD0000">"_http_default"</span><span style="color: #007700">, </span><span style="color: #DD0000">"valor de datos personalizados"</span><span style="color: #007700">);

</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bind</span><span style="color: #007700">(</span><span style="color: #DD0000">"0.0.0.0"</span><span style="color: #007700">, </span><span style="color: #0000BB">8010</span><span style="color: #007700">);
</span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">loop</span><span style="color: #007700">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

   <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
a=12
HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close

HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close
(presione Enter)

HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
Connection: close
</pre></div>
  </div>
 </div>
 <div class="example" id="example-9">
  <p><strong>Ejemplo #9 Servidor HTTPS simple</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/*
 * Servidor HTTPS simple.
 *
 * 1) Ejecute el servidor: `php examples/https.php 9999`
 * 2) Pruébelo: `php examples/ssl-connection.php 9999`
 */

</span><span style="color: #007700">function </span><span style="color: #0000BB">_http_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">) {
    static </span><span style="color: #0000BB">$counter      </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;
    static </span><span style="color: #0000BB">$max_requests </span><span style="color: #007700">= </span><span style="color: #0000BB">200</span><span style="color: #007700">;

    if (++</span><span style="color: #0000BB">$counter </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">$max_requests</span><span style="color: #007700">)  {
        echo </span><span style="color: #DD0000">"El contador ha alcanzado el número máximo de peticiones (</span><span style="color: #0000BB">$max_requests</span><span style="color: #DD0000">). Salida\n"</span><span style="color: #007700">;
        exit();
    }

    echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #DD0000">" llamada\n"</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"Petición :"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">);
    echo </span><span style="color: #DD0000">"Datos :"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">);

    echo </span><span style="color: #DD0000">"\n===== DUMP =====\n"</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"Comando :"</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getCommand</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"URI :"</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getUri</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"Encabezados de entrada :"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getInputHeaders</span><span style="color: #007700">());
    echo </span><span style="color: #DD0000">"Encabezados de salida :"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getOutputHeaders</span><span style="color: #007700">());

    echo </span><span style="color: #DD0000">"\n &gt;&gt; Enviando la respuesta ..."</span><span style="color: #007700">;
    </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sendReply</span><span style="color: #007700">(</span><span style="color: #0000BB">200</span><span style="color: #007700">, </span><span style="color: #DD0000">"OK"</span><span style="color: #007700">);
    echo </span><span style="color: #DD0000">"OK\n"</span><span style="color: #007700">;

    </span><span style="color: #0000BB">$buf </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getInputBuffer</span><span style="color: #007700">();
    echo </span><span style="color: #DD0000">"\n &gt;&gt; Lectura del buffer de entrada ("</span><span style="color: #007700">, </span><span style="color: #0000BB">$buf</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">length</span><span style="color: #007700">, </span><span style="color: #DD0000">") ...\n"</span><span style="color: #007700">;
    while (</span><span style="color: #0000BB">$s </span><span style="color: #007700">= </span><span style="color: #0000BB">$buf</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">read</span><span style="color: #007700">(</span><span style="color: #0000BB">1024</span><span style="color: #007700">)) {
        echo </span><span style="color: #0000BB">$s</span><span style="color: #007700">;
    }
    echo </span><span style="color: #DD0000">"\nNo hay más datos en el buffer\n"</span><span style="color: #007700">;
}

function </span><span style="color: #0000BB">_http_about</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">) {
    echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"URI : "</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getUri</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"\n &gt;&gt; Enviando la respuesta ..."</span><span style="color: #007700">;
    </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sendReply</span><span style="color: #007700">(</span><span style="color: #0000BB">200</span><span style="color: #007700">, </span><span style="color: #DD0000">"OK"</span><span style="color: #007700">);
    echo </span><span style="color: #DD0000">"OK\n"</span><span style="color: #007700">;
}

function </span><span style="color: #0000BB">_http_default</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">) {
    echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"URI: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getUri</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"\n &gt;&gt; Enviando la respuesta ..."</span><span style="color: #007700">;
    </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sendReply</span><span style="color: #007700">(</span><span style="color: #0000BB">200</span><span style="color: #007700">, </span><span style="color: #DD0000">"OK"</span><span style="color: #007700">);
    echo </span><span style="color: #DD0000">"OK\n"</span><span style="color: #007700">;
}

function </span><span style="color: #0000BB">_http_400</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">) {
    </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">sendError</span><span style="color: #007700">(</span><span style="color: #0000BB">400</span><span style="color: #007700">);
}

function </span><span style="color: #0000BB">_init_ssl</span><span style="color: #007700">() {
    </span><span style="color: #0000BB">$local_cert </span><span style="color: #007700">= </span><span style="color: #0000BB">__DIR__</span><span style="color: #007700">.</span><span style="color: #DD0000">"/ssl-echo-server/cert.pem"</span><span style="color: #007700">;
    </span><span style="color: #0000BB">$local_pk   </span><span style="color: #007700">= </span><span style="color: #0000BB">__DIR__</span><span style="color: #007700">.</span><span style="color: #DD0000">"/ssl-echo-server/privkey.pem"</span><span style="color: #007700">;

    </span><span style="color: #0000BB">$ctx </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">(</span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">SSLv3_SERVER_METHOD</span><span style="color: #007700">, array (
        </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_LOCAL_CERT  </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$local_cert</span><span style="color: #007700">,
        </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_LOCAL_PK    </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$local_pk</span><span style="color: #007700">,
        </span><span style="color: #FF8000">//EventSslContext::OPT_PASSPHRASE  =&gt; "test",
        </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_ALLOW_SELF_SIGNED </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true</span><span style="color: #007700">,
    ));

    return </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">;
}

</span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">9999</span><span style="color: #007700">;
if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">) {
    </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">];
}
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">) {
    exit(</span><span style="color: #DD0000">"Puerto inválido"</span><span style="color: #007700">);
}
</span><span style="color: #0000BB">$ip </span><span style="color: #007700">= </span><span style="color: #DD0000">'0.0.0.0'</span><span style="color: #007700">;

</span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();
</span><span style="color: #0000BB">$ctx  </span><span style="color: #007700">= </span><span style="color: #0000BB">_init_ssl</span><span style="color: #007700">();
</span><span style="color: #0000BB">$http </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventHttp</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">);
</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setAllowedMethods</span><span style="color: #007700">(</span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">::</span><span style="color: #0000BB">CMD_GET </span><span style="color: #007700">| </span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">::</span><span style="color: #0000BB">CMD_POST</span><span style="color: #007700">);

</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setCallback</span><span style="color: #007700">(</span><span style="color: #DD0000">"/dump"</span><span style="color: #007700">, </span><span style="color: #DD0000">"_http_dump"</span><span style="color: #007700">, array(</span><span style="color: #0000BB">4</span><span style="color: #007700">, </span><span style="color: #0000BB">8</span><span style="color: #007700">));
</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setCallback</span><span style="color: #007700">(</span><span style="color: #DD0000">"/about"</span><span style="color: #007700">, </span><span style="color: #DD0000">"_http_about"</span><span style="color: #007700">);
</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setCallback</span><span style="color: #007700">(</span><span style="color: #DD0000">"/err400"</span><span style="color: #007700">, </span><span style="color: #DD0000">"_http_400"</span><span style="color: #007700">);
</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setDefaultCallback</span><span style="color: #007700">(</span><span style="color: #DD0000">"_http_default"</span><span style="color: #007700">, </span><span style="color: #DD0000">"Valor de los datos personalizados"</span><span style="color: #007700">);

</span><span style="color: #0000BB">$http</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bind</span><span style="color: #007700">(</span><span style="color: #0000BB">$ip</span><span style="color: #007700">, </span><span style="color: #0000BB">$port</span><span style="color: #007700">);
</span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();</span></code></pre></div>
  </div>

 </div>
 <div class="example" id="example-10">
  <p><strong>Ejemplo #10 Conexión OpenSSL</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/*
 * Ejemplo de Cliente OpenSSL.
 *
 * Uso:
 * 1) Ejecute un servidor, i.e. :
 * $ php examples/https.php 9999
 *
 * 2) Lance el cliente en otro terminal:
 * $ php examples/ssl-connection.php 9999
 */

</span><span style="color: #007700">function </span><span style="color: #0000BB">_request_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">) {
    echo </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;

    if (</span><span style="color: #0000BB">is_null</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">)) {
        echo </span><span style="color: #DD0000">"Tiempo máximo de espera alcanzado\n"</span><span style="color: #007700">;
    } else {
        </span><span style="color: #0000BB">$response_code </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getResponseCode</span><span style="color: #007700">();

        if (</span><span style="color: #0000BB">$response_code </span><span style="color: #007700">== </span><span style="color: #0000BB">0</span><span style="color: #007700">) {
            echo </span><span style="color: #DD0000">"Conexión rechazada\n"</span><span style="color: #007700">;
        } elseif (</span><span style="color: #0000BB">$response_code </span><span style="color: #007700">!= </span><span style="color: #0000BB">200</span><span style="color: #007700">) {
            echo </span><span style="color: #DD0000">"Respuesta inesperada : </span><span style="color: #0000BB">$response_code</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;
        } else {
            echo </span><span style="color: #DD0000">"Éxito : </span><span style="color: #0000BB">$response_code</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;
            </span><span style="color: #0000BB">$buf </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getInputBuffer</span><span style="color: #007700">();
            echo </span><span style="color: #DD0000">"Cuerpo :\n"</span><span style="color: #007700">;
            while (</span><span style="color: #0000BB">$s </span><span style="color: #007700">= </span><span style="color: #0000BB">$buf</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">readLine</span><span style="color: #007700">(</span><span style="color: #0000BB">EventBuffer</span><span style="color: #007700">::</span><span style="color: #0000BB">EOL_ANY</span><span style="color: #007700">)) {
                echo </span><span style="color: #0000BB">$s</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
            }
        }
    }

    </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">);
}

function </span><span style="color: #0000BB">_init_ssl</span><span style="color: #007700">() {
    </span><span style="color: #0000BB">$ctx </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">(</span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">SSLv3_CLIENT_METHOD</span><span style="color: #007700">, array ());

    return </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">;
}

</span><span style="color: #FF8000">// Permite el sobrescrito del puerto
</span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">9999</span><span style="color: #007700">;
if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">) {
    </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">];
}
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">) {
    exit(</span><span style="color: #DD0000">"Puerto inválido\n"</span><span style="color: #007700">);
}
</span><span style="color: #0000BB">$host </span><span style="color: #007700">= </span><span style="color: #DD0000">'127.0.0.1'</span><span style="color: #007700">;

</span><span style="color: #0000BB">$ctx </span><span style="color: #007700">= </span><span style="color: #0000BB">_init_ssl</span><span style="color: #007700">();
if (!</span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {
    </span><span style="color: #0000BB">trigger_error</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fallo en la creación del contexto SSL"</span><span style="color: #007700">, </span><span style="color: #0000BB">E_USER_ERROR</span><span style="color: #007700">);
}

</span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();
if (!</span><span style="color: #0000BB">$base</span><span style="color: #007700">) {
    </span><span style="color: #0000BB">trigger_error</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fallo en la inicialización de la base de evento"</span><span style="color: #007700">, </span><span style="color: #0000BB">E_USER_ERROR</span><span style="color: #007700">);
}

</span><span style="color: #0000BB">$conn </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventHttpConnection</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">NULL</span><span style="color: #007700">, </span><span style="color: #0000BB">$host</span><span style="color: #007700">, </span><span style="color: #0000BB">$port</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">);
</span><span style="color: #0000BB">$conn</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setTimeout</span><span style="color: #007700">(</span><span style="color: #0000BB">50</span><span style="color: #007700">);

</span><span style="color: #0000BB">$req </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">(</span><span style="color: #DD0000">"_request_handler"</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">);
</span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">addHeader</span><span style="color: #007700">(</span><span style="color: #DD0000">"Host"</span><span style="color: #007700">, </span><span style="color: #0000BB">$host</span><span style="color: #007700">, </span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">::</span><span style="color: #0000BB">OUTPUT_HEADER</span><span style="color: #007700">);
</span><span style="color: #0000BB">$buf </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getOutputBuffer</span><span style="color: #007700">();
</span><span style="color: #0000BB">$buf</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">add</span><span style="color: #007700">(</span><span style="color: #DD0000">"&lt;html&gt;HTML TEST&lt;/html&gt;"</span><span style="color: #007700">);
</span><span style="color: #FF8000">//$req-&gt;addHeader("Content-Length", $buf-&gt;length, EventHttpRequest::OUTPUT_HEADER);
//$req-&gt;addHeader("Connection", "close", EventHttpRequest::OUTPUT_HEADER);
</span><span style="color: #0000BB">$conn</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">makeRequest</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">, </span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">::</span><span style="color: #0000BB">CMD_POST</span><span style="color: #007700">, </span><span style="color: #DD0000">"/dump"</span><span style="color: #007700">);

</span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();
echo </span><span style="color: #DD0000">"FIN\n"</span><span style="color: #007700">;
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

 </div>
 <div class="example" id="example-11">
  <p><strong>Ejemplo #11 
   Ejemplo con <span class="function"><a href="eventhttpconnection.makerequest.php" class="function">EventHttpConnection::makeRequest()</a></span></strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">function </span><span style="color: #0000BB">_request_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">) {
    echo </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;

    if (</span><span style="color: #0000BB">is_null</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">)) {
        echo </span><span style="color: #DD0000">"Tiempo máximo de espera alcanzado\n"</span><span style="color: #007700">;
    } else {
        </span><span style="color: #0000BB">$response_code </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getResponseCode</span><span style="color: #007700">();

        if (</span><span style="color: #0000BB">$response_code </span><span style="color: #007700">== </span><span style="color: #0000BB">0</span><span style="color: #007700">) {
            echo </span><span style="color: #DD0000">"Conexión rechazada\n"</span><span style="color: #007700">;
        } elseif (</span><span style="color: #0000BB">$response_code </span><span style="color: #007700">!= </span><span style="color: #0000BB">200</span><span style="color: #007700">) {
            echo </span><span style="color: #DD0000">"Respuesta inesperada : </span><span style="color: #0000BB">$response_code</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;
        } else {
            echo </span><span style="color: #DD0000">"Éxito : </span><span style="color: #0000BB">$response_code</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;
            </span><span style="color: #0000BB">$buf </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getInputBuffer</span><span style="color: #007700">();
            echo </span><span style="color: #DD0000">"Cuerpo :\n"</span><span style="color: #007700">;
            while (</span><span style="color: #0000BB">$s </span><span style="color: #007700">= </span><span style="color: #0000BB">$buf</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">readLine</span><span style="color: #007700">(</span><span style="color: #0000BB">EventBuffer</span><span style="color: #007700">::</span><span style="color: #0000BB">EOL_ANY</span><span style="color: #007700">)) {
                echo </span><span style="color: #0000BB">$s</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
            }
        }
    }

    </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">);
}

</span><span style="color: #0000BB">$address </span><span style="color: #007700">= </span><span style="color: #DD0000">"127.0.0.1"</span><span style="color: #007700">;
</span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">80</span><span style="color: #007700">;

</span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();
</span><span style="color: #0000BB">$conn </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventHttpConnection</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">NULL</span><span style="color: #007700">, </span><span style="color: #0000BB">$address</span><span style="color: #007700">, </span><span style="color: #0000BB">$port</span><span style="color: #007700">);
</span><span style="color: #0000BB">$conn</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setTimeout</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">);
</span><span style="color: #0000BB">$req </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">(</span><span style="color: #DD0000">"_request_handler"</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">);

</span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">addHeader</span><span style="color: #007700">(</span><span style="color: #DD0000">"Host"</span><span style="color: #007700">, </span><span style="color: #0000BB">$address</span><span style="color: #007700">, </span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">::</span><span style="color: #0000BB">OUTPUT_HEADER</span><span style="color: #007700">);
</span><span style="color: #0000BB">$req</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">addHeader</span><span style="color: #007700">(</span><span style="color: #DD0000">"Content-Length"</span><span style="color: #007700">, </span><span style="color: #DD0000">"0"</span><span style="color: #007700">, </span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">::</span><span style="color: #0000BB">OUTPUT_HEADER</span><span style="color: #007700">);
</span><span style="color: #0000BB">$conn</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">makeRequest</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">, </span><span style="color: #0000BB">EventHttpRequest</span><span style="color: #007700">::</span><span style="color: #0000BB">CMD_GET</span><span style="color: #007700">, </span><span style="color: #DD0000">"/index.cphp"</span><span style="color: #007700">);

</span><span style="color: #0000BB">$base</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">loop</span><span style="color: #007700">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

   <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
_request_handler
Éxito : 200
Cuerpo :
PHP, date:
2013-03-13T20:27:52+05:00
</pre></div>
  </div>
 </div>
 <div class="example" id="example-12">
  <p><strong>Ejemplo #12 Escucha de una conexión basada en un socket de dominio Unix</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">/*
 * Servidor de escucha basado en un oyente de conexión libevent.
 *
 * Uso:
 * 1) En un terminal, ejecute:
 *
 * $ php unix-domain-listener.php [ruta-al-socket]
 *
 * 2) En otro terminal, abra la conexión
 * hacia el socket, i.e. :
 *
 * $ socat - GOPEN:/tmp/1.sock
 *
 * 3) Comience a escribir. El servidor debería repetir las entradas.
 */

</span><span style="color: #007700">class </span><span style="color: #0000BB">MyListenerConnection </span><span style="color: #007700">{
    private </span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">;

    public function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {
        if (</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bev</span><span style="color: #007700">) {
            </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">();
        }
    }

    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">) {
        </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">;

        </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">);

        </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">,
            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">);

        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">)) {
            echo </span><span style="color: #DD0000">"Fallo en la activación de READ\n"</span><span style="color: #007700">;
            return;
        }
    }

    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">) {
        </span><span style="color: #FF8000">// Copia todos los datos desde el buffer de entrada hacia el buffer de salida
        </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">);
    }

    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">) {
        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">) {
            echo </span><span style="color: #DD0000">"Error desde bufferevent\n"</span><span style="color: #007700">;
        }

        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">)) {
            </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">free</span><span style="color: #007700">();
            </span><span style="color: #0000BB">$bev </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;
        }
    }
}

class </span><span style="color: #0000BB">MyListener </span><span style="color: #007700">{
    public </span><span style="color: #0000BB">$base</span><span style="color: #007700">,
        </span><span style="color: #0000BB">$listener</span><span style="color: #007700">,
        </span><span style="color: #0000BB">$socket</span><span style="color: #007700">;
    private </span><span style="color: #0000BB">$conn </span><span style="color: #007700">= array();

    public function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {
        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">;
    }

    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$sock_path</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">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();
        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base</span><span style="color: #007700">) {
            echo </span><span style="color: #DD0000">"No se pudo abrir la base de eventos"</span><span style="color: #007700">;
            exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);
        }

        if (</span><span style="color: #0000BB">file_exists</span><span style="color: #007700">(</span><span style="color: #0000BB">$sock_path</span><span style="color: #007700">)) {
            </span><span style="color: #0000BB">unlink</span><span style="color: #007700">(</span><span style="color: #0000BB">$sock_path</span><span style="color: #007700">);
        }

         </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">,
             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">,
             </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">,
             </span><span style="color: #DD0000">"unix:</span><span style="color: #0000BB">$sock_path</span><span style="color: #DD0000">"</span><span style="color: #007700">);

        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">listener</span><span style="color: #007700">) {
            </span><span style="color: #0000BB">trigger_error</span><span style="color: #007700">(</span><span style="color: #DD0000">"Imposible crear el oyente"</span><span style="color: #007700">, </span><span style="color: #0000BB">E_USER_ERROR</span><span style="color: #007700">);
        }

        </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">));
    }

    public function </span><span style="color: #0000BB">dispatch</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">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();
    }

    </span><span style="color: #FF8000">// Esta función de retrollamada será llamada cuando haya datos para leer en $bev
    </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">) {
        </span><span style="color: #FF8000">// ¡Tenemos una nueva conexión! Se define un bufferevent para ella. */
        </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">;
        </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">);
    }

    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">) {
        </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">;

        </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">"Se recibe un error %d (%s) en el oyente. "
            </span><span style="color: #007700">.</span><span style="color: #DD0000">"Cerrando.\n"</span><span style="color: #007700">,
            </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketErrno</span><span style="color: #007700">(),
            </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketError</span><span style="color: #007700">());

        </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">);
    }
}

if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">&lt;= </span><span style="color: #0000BB">1</span><span style="color: #007700">) {
    exit(</span><span style="color: #DD0000">"La ruta hacia el socket no está proporcionada\n"</span><span style="color: #007700">);
}
</span><span style="color: #0000BB">$sock_path </span><span style="color: #007700">= </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];

</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">$sock_path</span><span style="color: #007700">);
</span><span style="color: #0000BB">$l</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
  </div>

 </div>
 <div class="example" id="event.example.smtp">
  <p><strong>Ejemplo #13 Ejemplo de servidor SMTP</strong></p>
  <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
 </span><span style="color: #FF8000">/*
 * Autor: Andrew Rose &lt;hello at andrewrose dot co dot uk&gt;
 *
 * Uso:
 * 1) Prepare el certificado cert.pem y la clave privada privkey.pem.
 * 2) Inicie el script del servidor
 * 3) Abra la conexión TLS, i.e. :
 *      $ openssl s_client -connect localhost:25 -starttls smtp -crlf
 * 4) Comience a probar los comandos listados en el método `cmd` a continuación.
 */

</span><span style="color: #007700">class </span><span style="color: #0000BB">Handler </span><span style="color: #007700">{
    public </span><span style="color: #0000BB">$domainName </span><span style="color: #007700">= </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">;
    public </span><span style="color: #0000BB">$connections </span><span style="color: #007700">= [];
    public </span><span style="color: #0000BB">$buffers </span><span style="color: #007700">= [];
    public </span><span style="color: #0000BB">$maxRead </span><span style="color: #007700">= </span><span style="color: #0000BB">256000</span><span style="color: #007700">;

    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ctx </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">(</span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">SSLv3_SERVER_METHOD</span><span style="color: #007700">, [
            </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_LOCAL_CERT  </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'cert.pem'</span><span style="color: #007700">,
            </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_LOCAL_PK    </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'privkey.pem'</span><span style="color: #007700">,
            </span><span style="color: #FF8000">//EventSslContext::OPT_PASSPHRASE  =&gt; '',
            </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_VERIFY_PEER </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">false</span><span style="color: #007700">, </span><span style="color: #FF8000">// cambiar a TRUE con certificados auténticos
            </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_ALLOW_SELF_SIGNED </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true </span><span style="color: #FF8000">// cambiar a FALSE con certificados auténticos
        </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">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();
        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">base</span><span style="color: #007700">) {
            exit(</span><span style="color: #DD0000">"Imposible abrir la base del evento\n"</span><span style="color: #007700">);
        }

        if (!</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">,
            [</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">'ev_accept'</span><span style="color: #007700">],
            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ctx</span><span style="color: #007700">,
            </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">,
            </span><span style="color: #DD0000">'0.0.0.0:25'</span><span style="color: #007700">))
        {
            exit(</span><span style="color: #DD0000">"Imposible crear el oyente\n"</span><span style="color: #007700">);
        }

        </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">([</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">'ev_error'</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">-&gt;</span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();
    }

    public function </span><span style="color: #0000BB">ev_accept</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">) {
        static </span><span style="color: #0000BB">$id </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;
        </span><span style="color: #0000BB">$id </span><span style="color: #007700">+= </span><span style="color: #0000BB">1</span><span style="color: #007700">;

        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'clientData'</span><span style="color: #007700">] = </span><span style="color: #DD0000">''</span><span style="color: #007700">;
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'cnx'</span><span style="color: #007700">] = new </span><span style="color: #0000BB">EventBufferEvent</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">, </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">);

        if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'cnx'</span><span style="color: #007700">]) {
            echo </span><span style="color: #DD0000">"Fallo en la creación del buffer\n"</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">-&gt;</span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);
            exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);
        }

        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'cnx'</span><span style="color: #007700">]-&gt;</span><span style="color: #0000BB">setCallbacks</span><span style="color: #007700">([</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"ev_read"</span><span style="color: #007700">], </span><span style="color: #0000BB">NULL</span><span style="color: #007700">,
            [</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">'ev_error'</span><span style="color: #007700">], </span><span style="color: #0000BB">$id</span><span style="color: #007700">);
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'cnx'</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">| </span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">WRITE</span><span style="color: #007700">);

        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ev_write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #DD0000">'220 '</span><span style="color: #007700">.</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">domainName</span><span style="color: #007700">.</span><span style="color: #DD0000">" wazzzap?\r\n"</span><span style="color: #007700">);
    }

    function </span><span style="color: #0000BB">ev_error</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">) {
        </span><span style="color: #0000BB">$errno </span><span style="color: #007700">= </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketErrno</span><span style="color: #007700">();

        </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">"Se recibe el error %d (%s) en el oyente. Detención.\n"</span><span style="color: #007700">,
            </span><span style="color: #0000BB">$errno</span><span style="color: #007700">, </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketError</span><span style="color: #007700">());

        if (</span><span style="color: #0000BB">$errno </span><span style="color: #007700">!= </span><span style="color: #0000BB">0</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">-&gt;</span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);
            exit();
        }
    }

    public function </span><span style="color: #0000BB">ev_close</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">) {
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'cnx'</span><span style="color: #007700">]-&gt;</span><span style="color: #0000BB">disable</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">| </span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">WRITE</span><span style="color: #007700">);
        unset(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">]);
    }

    protected function </span><span style="color: #0000BB">ev_write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #0000BB">$string</span><span style="color: #007700">) {
        echo </span><span style="color: #DD0000">'S('</span><span style="color: #007700">.</span><span style="color: #0000BB">$id</span><span style="color: #007700">.</span><span style="color: #DD0000">'): '</span><span style="color: #007700">.</span><span style="color: #0000BB">$string</span><span style="color: #007700">;
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'cnx'</span><span style="color: #007700">]-&gt;</span><span style="color: #0000BB">write</span><span style="color: #007700">(</span><span style="color: #0000BB">$string</span><span style="color: #007700">);
    }

    public function </span><span style="color: #0000BB">ev_read</span><span style="color: #007700">(</span><span style="color: #0000BB">$buffer</span><span style="color: #007700">, </span><span style="color: #0000BB">$id</span><span style="color: #007700">) {
        while(</span><span style="color: #0000BB">$buffer</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">input</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">length </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">) {
            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'clientData'</span><span style="color: #007700">] .= </span><span style="color: #0000BB">$buffer</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">input</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">read</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">maxRead</span><span style="color: #007700">);
            </span><span style="color: #0000BB">$clientDataLen </span><span style="color: #007700">= </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'clientData'</span><span style="color: #007700">]);

            if(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'clientData'</span><span style="color: #007700">][</span><span style="color: #0000BB">$clientDataLen</span><span style="color: #007700">-</span><span style="color: #0000BB">1</span><span style="color: #007700">] == </span><span style="color: #DD0000">"\n"
                </span><span style="color: #007700">&amp;&amp; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'clientData'</span><span style="color: #007700">][</span><span style="color: #0000BB">$clientDataLen</span><span style="color: #007700">-</span><span style="color: #0000BB">2</span><span style="color: #007700">] == </span><span style="color: #DD0000">"\r"</span><span style="color: #007700">)
            {
                </span><span style="color: #FF8000">// Elimina los caracteres \r\n al final
                </span><span style="color: #0000BB">$line </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'clientData'</span><span style="color: #007700">], </span><span style="color: #0000BB">0</span><span style="color: #007700">,
                    </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'clientData'</span><span style="color: #007700">]) - </span><span style="color: #0000BB">2</span><span style="color: #007700">);

                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'clientData'</span><span style="color: #007700">] = </span><span style="color: #DD0000">''</span><span style="color: #007700">;
                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">cmd</span><span style="color: #007700">(</span><span style="color: #0000BB">$buffer</span><span style="color: #007700">, </span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #0000BB">$line</span><span style="color: #007700">);
            }
        }
    }

    protected function </span><span style="color: #0000BB">cmd</span><span style="color: #007700">(</span><span style="color: #0000BB">$buffer</span><span style="color: #007700">, </span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #0000BB">$line</span><span style="color: #007700">) {
        switch (</span><span style="color: #0000BB">$line</span><span style="color: #007700">) {
            case </span><span style="color: #0000BB">strncmp</span><span style="color: #007700">(</span><span style="color: #DD0000">'EHLO '</span><span style="color: #007700">, </span><span style="color: #0000BB">$line</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">):
                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ev_write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #DD0000">"250-STARTTLS\r\n"</span><span style="color: #007700">);
                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ev_write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #DD0000">"250 OK ehlo\r\n"</span><span style="color: #007700">);
                break;

            case </span><span style="color: #0000BB">strncmp</span><span style="color: #007700">(</span><span style="color: #DD0000">'HELO '</span><span style="color: #007700">, </span><span style="color: #0000BB">$line</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">):
                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ev_write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #DD0000">"250-STARTTLS\r\n"</span><span style="color: #007700">);
                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ev_write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #DD0000">"250 OK helo\r\n"</span><span style="color: #007700">);
                break;

            case </span><span style="color: #0000BB">strncmp</span><span style="color: #007700">(</span><span style="color: #DD0000">'QUIT'</span><span style="color: #007700">, </span><span style="color: #0000BB">$line</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">):
                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ev_write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #DD0000">"250 OK quit\r\n"</span><span style="color: #007700">);
                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ev_close</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">);
                break;

            case </span><span style="color: #0000BB">strncmp</span><span style="color: #007700">(</span><span style="color: #DD0000">'STARTTLS'</span><span style="color: #007700">, </span><span style="color: #0000BB">$line</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">):
                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ev_write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #DD0000">"220 Ready to start TLS\r\n"</span><span style="color: #007700">);
                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'cnx'</span><span style="color: #007700">] = </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">sslFilter</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">,
                    </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'cnx'</span><span style="color: #007700">], </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ctx</span><span style="color: #007700">,
                    </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">SSL_ACCEPTING</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">);
                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'cnx'</span><span style="color: #007700">]-&gt;</span><span style="color: #0000BB">setCallbacks</span><span style="color: #007700">([</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"ev_read"</span><span style="color: #007700">], </span><span style="color: #0000BB">NULL</span><span style="color: #007700">, [</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">'ev_error'</span><span style="color: #007700">], </span><span style="color: #0000BB">$id</span><span style="color: #007700">);
                </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">][</span><span style="color: #DD0000">'cnx'</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">| </span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">WRITE</span><span style="color: #007700">);
                break;

            default:
                echo </span><span style="color: #DD0000">'Comando desconocido : '</span><span style="color: #007700">.</span><span style="color: #0000BB">$line</span><span style="color: #007700">.</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;
                break;
        }
    }
}

new </span><span style="color: #0000BB">Handler</span><span style="color: #007700">();</span></code></pre></div>
  </div>

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