<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'event.examples.php',
    1 => 'Exemples',
    2 => 'Exemples',
  ),
  'up' => 
  array (
    0 => 'book.event.php',
    1 => 'Event',
  ),
  'prev' => 
  array (
    0 => 'event.installation.php',
    1 => 'Installation',
  ),
  'next' => 
  array (
    0 => 'event.flags.php',
    1 => 'Les drapeaux d\'&eacute;v&eacute;nements',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">Exemples</h1>

 <div class="example" id="example-1">
  <p><strong>Exemple #1 Client 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">// Lecture de la fonction de rappel
</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">// Fonction de rappel de l'événement
</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">"Connecté.\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">"Erreur 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">"Fermeture\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">"Fait !\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">// Nous utilisons une résolution DNS asynchrone
</span><span style="color: #007700">if (!</span><span style="color: #0000BB">$dns_base</span><span style="color: #007700">) {
    exit(</span><span style="color: #DD0000">"Échec dans l'initialisation 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">"Échec dans la création du 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">"Échec dans l'ajout de la requête dans le buffer de sortie\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">"Connexion impossible à l'hôte </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>Résultat de l&#039;exemple ci-dessus est similaire à :</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>Exemple #2 Client HTTP en utilisant une résolution DNS asynchrone</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. Connexion à 127.0.0.1 sur le port 80
 * en utilisant EventBufferEvent::connect().
 *
 * 2. Requête /index.cphp via HTTP/1.0
 * en utilisant le buffer de sortie.
 *
 * 3. Lecture asynchrone de la réponse et l'affiche dans stdout.
 */

// Lecture de la fonction de rappel
</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">// Fonction de rappel de l'événement
</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">"Connecté.\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">"Erreur 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">"Fermeture\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">"Fait !\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">"étape 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">"Échec lors de la création du socket bufferevent\n"</span><span style="color: #007700">);
}

echo </span><span style="color: #DD0000">"étape 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">"étape n°3\n"</span><span style="color: #007700">;
</span><span style="color: #FF8000">// Envoi de la requête
</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">"Échec lors de l'ajout de la requête dans le buffer de sortie\n"</span><span style="color: #007700">);
}

</span><span style="color: #FF8000">/* Connexion à l'hôte de façon synchrone.
Nous connaissons l'IP, nous n'avons donc pas besoin de résolution 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">"Impossible de se connecter à l'hôte\n"</span><span style="color: #007700">);
}

</span><span style="color: #FF8000">// Diffuse les événements en attente
</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>Exemple #3 Serveur d&#039;affichage</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">/*
 * Serveur d'affichage simple basé sur les écoutes de connexion libevent.
 *
 * Utilisation :
 * 1) Dans un terminal, exécutez :
 *
 * $ php listener.php 9881
 *
 * 2) Dans un autre terminal, ouvrez une connexion, i.e. :
 *
 * $ nc 127.0.0.1 9881
 *
 * 3) Commencez à taper. Le serveur devrait répéter les entrées.
 */

</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">"Échec dans l'activation 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">// Copie toutes les données depuis le buffer d'entrée vers le buffer de sortie

        // Variant #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">/* Variant #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">"Erreur depuis 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">"Impossible d'ouvrir l'événement de base"</span><span style="color: #007700">;
            exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);
        }

        </span><span style="color: #FF8000">// Variant #1
        /*
        $this-&gt;socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if (!socket_bind($this-&gt;socket, '0.0.0.0', $port)) {
            echo "Impossible de lier le 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);
         */

        // Variant #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">"Impossible de créer l'écouteur"</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">// Cette fonction de rappel est appelée lorsqu'il y a des données à lire sur $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">// Nous avons une nouvelle connexion ! On définit un bufferevent pour elle. */
        </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">"On reçoit une erreur %d (%s) sur l'écouteur. "
            </span><span style="color: #007700">.</span><span style="color: #DD0000">"Arrêt.\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">"Port invalide"</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>Exemple #4 Serveur d&#039;affichage 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">/*
 * Serveur d'affichage SSL
 *
 * Pour tester :
 * 1) Exécutez :
 * $ php examples/ssl-echo-server/server.php 9998
 *
 * 2) dans un autre terminal, exécutez :
 * $ 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">"Échec lors de la création du contexte 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">"Impossible d'ouvrir l'événement de base\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">"Impossible de créer l'écouteur\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">// Cette fonction de rappel est appelée lorsqu'il y a des données à lire sur $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">"Réception de %zu octets\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">"----- données ----\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">// Cette fonction de rappel est appelée lorsque des erreurs surviennent sur l'écouteur d'événement,
    // i.e. la connexion se ferme, ou une erreur survient
    </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">// Récupère les erreurs depuis la pile d'erreur 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">"Erreur 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">// Cette fonction de rappel est appelée lorsqu'un client accepte une nouvelle connexion
    </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">// Nous avons une nouvelle connexion ! On définit un bufferevent pour elle.
        </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">"Échec lors de la création du 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">// Cette fonction de rappel est appelée lorsqu'on échoue à définir une nouvelle connexion pour un client
    </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">"On reçoit une erreur %d (%s) sur l'écouteur. "
            </span><span style="color: #007700">.</span><span style="color: #DD0000">"Arrêt.\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">// Initialise les structures SSL ; crée un EventSslContext
    // Optionnellement, crée des certificats autosignés
    </span><span style="color: #007700">function </span><span style="color: #0000BB">init_ssl</span><span style="color: #007700">() {
        </span><span style="color: #FF8000">// Nous *devons* avoir l'entropie. Sinon, il n'y a aucun intérêt à chiffrer.
        </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">"Échec 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">"Impossible de lire le fichier </span><span style="color: #0000BB">$local_cert</span><span style="color: #DD0000"> ou </span><span style="color: #0000BB">$local_pk</span><span style="color: #DD0000">. Pour générer une clé\n"</span><span style="color: #007700">,
                </span><span style="color: #DD0000">"et un certificat autosigné, exécutez :\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">// Autorise l'écrasement du port
</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">"Port invalide\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>Exemple #5 Gestionnaire de signal</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">/*
Dans un terminal, exécutez :

$ php examples/signal.php

Dans un autre terminal, trouvez le pid et envoyez le signal 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

Dans le premier terminal, vous devriez attraper ce qui suit :

On attrape le signal 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">"On attrape le signal </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>Exemple #6 Utilisation d&#039;une boucle libevent pour réaliser les requêtes de l&#039;extension `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">// Fonction de rappel pour 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">"étape 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">"étape 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">"étape 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">"étape 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">"étape 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">"étape 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">"Fait !\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>Exemple #7 Divers</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">/* {{{ Configuration &amp; méthodes supportées */
</span><span style="color: #007700">echo </span><span style="color: #DD0000">"Méthodes supportées :\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">// On désactive la méthode "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">"La méthode 'select' a été désactivée\n"</span><span style="color: #007700">;
}

</span><span style="color: #FF8000">// Crée un event_base associé à la configuration
</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éthode d'événement utilisée : "</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">"fonctionnalités :\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 - E/S déclenchées par front\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 - opération O(1) pour l'ajout/suppression d'événements\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 - type de descripteur de fichiers arbitraire, et non uniquement les sockets\n"</span><span style="color: #007700">;

</span><span style="color: #FF8000">// Nécessite la fonctionnalité 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 fonctionnalité FDS est maintenant requise\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 - type de descripteur de fichiers arbitraire, et non uniquement les 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">/* on sort après 5 itérations avec un délai maximal d'attente de 2.33 secondes */
        </span><span style="color: #007700">echo </span><span style="color: #DD0000">"Arrêt...\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>Exemple #8 Serveur 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">/*
 * Serveur HTTP simple.
 *
 * Pour le tester :
 * 1) Exécutez-le sur le port de votre choix, i.e. :
 * $ php examples/http.php 8010
 * 2) Dans un autre terminal, connectez-vous sur une adresse de ce port
 * et effectuez des requêtes GET ou POST (les autres types sont désactivés dans cet exemple), i.e. :
 * $ nc -t 127.0.0.1 8010
 * POST /about HTTP/1.0
 * Content-Type: text/plain
 * Content-Length: 4
 * Connection: close
 * (press Enter)
 *
 * Il devrait afficher :
 * 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
 * (press Enter)
 *
 * Il devrait afficher :
 * HTTP/1.0 200 OK
 * Content-Type: text/html; charset=ISO-8859-1
 * Connection: close
 * (press Enter)
 *
 * $ nc -t 127.0.0.1 8010
 * GET /unknown HTTP/1.0
 * Connection: close
 *
 * Il devrait afficher :
 * HTTP/1.0 200 OK
 * Content-Type: text/html; charset=ISO-8859-1
 * Connection: close
 *
 * 3) Voir ce que le serveur affiche dans le terminal précédent.
 */

</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">"Le compteur a atteint le nombre maximal de requêtes (</span><span style="color: #0000BB">$max_requests</span><span style="color: #DD0000">). Sortie !\n"</span><span style="color: #007700">;
        exit();
    }

    echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #DD0000">" appelée\n"</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"Requête :"</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">"Données :"</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">"Commande :"</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">"En-têtes en entrée :"</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">"En-têtes en sortie :"</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; Envoi de la réponse ..."</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; Lecture du buffer d'entrée ...\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">"Il n'y a plus de données dans le 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; Envoi de la réponse ..."</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; Envoi de la réponse ..."</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">"Port invalide"</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">"valeur de données personnalisées"</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>Résultat de l&#039;exemple ci-dessus est similaire à :</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
(press 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>Exemple #9 Serveur 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">/*
 * Serveur HTTPS simple.
 *
 * 1) Exécutez le serveur : `php examples/https.php 9999`
 * 2) Testez le : `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">"Le compteur a atteint le nombre maximal de requêtes (</span><span style="color: #0000BB">$max_requests</span><span style="color: #DD0000">). Sortie\n"</span><span style="color: #007700">;
        exit();
    }

    echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #DD0000">" appelée\n"</span><span style="color: #007700">;
    echo </span><span style="color: #DD0000">"Requête :"</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">"Données :"</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">"Commande :"</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">"En-têtes d'entrée :"</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">"En-têtes de sortie :"</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; Envoi de la réponse ..."</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; Lecture du buffer d'entrée ("</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">"\nIl n'y a plus de données dans le 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; Envoi de la réponse ..."</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; Envoi de la réponse ..."</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">"Port invalide"</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">"Valeur des données personnalisées"</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>Exemple #10 Connexion 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">/*
 * Exemple de Client OpenSSL.
 *
 * Utilisation :
 * 1) Exécutez un serveur, i.e. :
 * $ php examples/https.php 9999
 *
 * 2) Lancez le client dans un autre 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">"Délai d'attente maximal atteint\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">"Connexion refusée\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">"Réponse inattendue : </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">"Succès : </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">"Corps :\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">// Autorise l'écrasement du port
</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">"Port invalide\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">"Échec lors de la création du contexte 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">"Échec dans l'initialisation de l'événement de base"</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>Exemple #11 
   Exemple avec <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">"Délai d'attente maximal atteint\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">"Connexion refusée\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">"Réponse inattendue : </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">"Succès : </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">"Corps :\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>Résultat de l&#039;exemple ci-dessus est similaire à :</p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
_request_handler
Succès : 200
Corps :
PHP, date:
2013-03-13T20:27:52+05:00
</pre></div>
  </div>
 </div>
 <div class="example" id="example-12">
  <p><strong>Exemple #12 Écoute d&#039;une connexion en se basant sur un socket de domaine 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">/*
 * Serveur d'écoute en se basant sur un écouteur de connexion libevent.
 *
 * Utilisation :
 * 1) Dans un terminal, exécutez :
 *
 * $ php unix-domain-listener.php [path-to-socket]
 *
 * 2) Dans un autre terminal, ouvrez la connexion
 * vers le socket, i.e. :
 *
 * $ socat - GOPEN:/tmp/1.sock
 *
 * 3) Commencez à taper. Le serveur devrait répéter les entrées.
 */

</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">"Échec dans l'activation 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">// Copie toutes les données depuis le buffer d'entrée dans le buffer de sortie
        </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">"Erreur depuis 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">"Impossible d'ouvrir l'événement de base"</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">"Impossible de créer l'écouteur"</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">// Cette fonction de rappel sera appelée lorsqu'il y aura des données à lire sur $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">// Nous avons une nouvelle connexion ! On définit un bufferevent pour elle. */
        </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">"On reçoit une erreur %d (%s) sur l'écouteur. "
            </span><span style="color: #007700">.</span><span style="color: #DD0000">"Arrêt.\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">"Le chemin vers le socket n'est pas fourni\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>Exemple #13 Exemple de serveur 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">/*
 * Auteur : Andrew Rose &lt;hello at andrewrose dot co dot uk&gt;
 *
 * Utilisation :
 * 1) On prépare le certificat cert.pem et la clé privée privkey.pem.
 * 2) On démarre le script du serveur
 * 3) On ouvre la connexion TLS, i.e. :
 *      $ openssl s_client -connect localhost:25 -starttls smtp -crlf
 * 4) On commence à tester les commandes listées dans la méthode `cmd` ci-dessous.
 */

</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">// modifier en TRUE avec les certificats authentiques
            </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">// modifier en FALSE avec les certificats authentiques
        </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">"Impossible d'ouvrir l'événement de base\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">"Impossible de créer l'écouteur\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">"Échec lors de la création du 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">"On reçoit l'erreur %d (%s) sur l'écouteur. On stoppe.\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">// Supprime les caractères \r\n à la fin
                </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">'Commande inconnue : '</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); ?>