<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Examples</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="event.resources.html">Resource Types</a></div> <div class="next" style="text-align: right; float: right;"><a href="event.flags.html">Event flags</a></div> <div class="up"><a href="book.event.html">Event</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="event.examples" class="chapter"> <h1>Examples</h1> <div class="example" id="example-4234"> <p><strong>Example #1 Simple HTTP client</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// Read callback<br /></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">) {<br /> </span><span style="color: #FF8000">//$input = $bev->input; //$bev->getInput();<br /> <br /> //$pos = $input->search("TTP");<br /> </span><span style="color: #0000BB">$pos </span><span style="color: #007700">= </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">input</span><span style="color: #007700">-></span><span style="color: #0000BB">search</span><span style="color: #007700">(</span><span style="color: #DD0000">"TTP"</span><span style="color: #007700">);<br /><br /> while ((</span><span style="color: #0000BB">$n </span><span style="color: #007700">= </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">input</span><span style="color: #007700">-></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">)) > </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br /> echo </span><span style="color: #0000BB">$buf</span><span style="color: #007700">;<br /> }<br />}<br /><br /></span><span style="color: #FF8000">// Event callback<br /></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">) {<br /> if (</span><span style="color: #0000BB">$events </span><span style="color: #007700">& </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">CONNECTED</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Connected.\n"</span><span style="color: #007700">;<br /> } elseif (</span><span style="color: #0000BB">$events </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">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">EOF</span><span style="color: #007700">)) {<br /> if (</span><span style="color: #0000BB">$events </span><span style="color: #007700">& </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">ERROR</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"DNS error: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">getDnsErrorString</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /> }<br /><br /> echo </span><span style="color: #DD0000">"Closing\n"</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">exit</span><span style="color: #007700">();<br /> exit(</span><span style="color: #DD0000">"Done\n"</span><span style="color: #007700">);<br /> }<br />}<br /><br />if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">!= </span><span style="color: #0000BB">3</span><span style="color: #007700">) {<br /> echo <<<EOS<br /></span><span style="color: #DD0000">Trivial HTTP 0.x client<br />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]<br />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 /<br /><br /></span><span style="color: #007700">EOS;<br /> exit();<br />}<br /><br /></span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();<br /><br /></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">// We'll use async DNS resolving<br /></span><span style="color: #007700">if (!</span><span style="color: #0000BB">$dns_base</span><span style="color: #007700">) {<br /> exit(</span><span style="color: #DD0000">"Failed to init DNS Base\n"</span><span style="color: #007700">);<br />}<br /><br /></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">,<br /> </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">,<br /> </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<br /></span><span style="color: #007700">);<br />if (!</span><span style="color: #0000BB">$bev</span><span style="color: #007700">) {<br /> exit(</span><span style="color: #DD0000">"Failed creating bufferevent socket\n"</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #FF8000">//$bev->setCallbacks("readcb", /* writecb */ NULL, "eventcb", $base);<br /></span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></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">);<br /><br /></span><span style="color: #0000BB">$output </span><span style="color: #007700">= </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">output</span><span style="color: #007700">; </span><span style="color: #FF8000">//$bev->getOutput();<br /></span><span style="color: #007700">if (!</span><span style="color: #0000BB">$output</span><span style="color: #007700">-></span><span style="color: #0000BB">add</span><span style="color: #007700">(<br /> </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">.<br /> </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">.<br /> </span><span style="color: #DD0000">"Connection: Close\r\n\r\n"<br /></span><span style="color: #007700">)) {<br /> exit(</span><span style="color: #DD0000">"Failed adding request to output buffer\n"</span><span style="color: #007700">);<br />}<br /><br />if (!</span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></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">)) {<br /> exit(</span><span style="color: #DD0000">"Can't connect to host </span><span style="color: #007700">{</span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]}</span><span style="color: #DD0000">\n"</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output something similar to:</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 <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="http://www.google.co.uk/">here</A>. </BODY></HTML> Closing Done </pre></div> </div> </div> <div class="example" id="example-4235"> <p><strong>Example #2 HTTP client using asynchronous DNS resolver</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">/*<br /> * 1. Connect to 127.0.0.1 at port 80<br /> * by means of EventBufferEvent::connect().<br /> *<br /> * 2. Request /index.cphp via HTTP/1.0<br /> * using the output buffer.<br /> *<br /> * 3. Asyncronously read the response and print it to stdout.<br /> */<br /><br />// Read callback<br /></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">) {<br /> </span><span style="color: #0000BB">$input </span><span style="color: #007700">= </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">getInput</span><span style="color: #007700">();<br /><br /> while ((</span><span style="color: #0000BB">$n </span><span style="color: #007700">= </span><span style="color: #0000BB">$input</span><span style="color: #007700">-></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">)) > </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br /> echo </span><span style="color: #0000BB">$buf</span><span style="color: #007700">;<br /> }<br />}<br /><br /></span><span style="color: #FF8000">// Event callback<br /></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">) {<br /> if (</span><span style="color: #0000BB">$events </span><span style="color: #007700">& </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">CONNECTED</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Connected.\n"</span><span style="color: #007700">;<br /> } elseif (</span><span style="color: #0000BB">$events </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">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">EOF</span><span style="color: #007700">)) {<br /> if (</span><span style="color: #0000BB">$events </span><span style="color: #007700">& </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">ERROR</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"DNS error: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">getDnsErrorString</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /> }<br /><br /> echo </span><span style="color: #DD0000">"Closing\n"</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">exit</span><span style="color: #007700">();<br /> exit(</span><span style="color: #DD0000">"Done\n"</span><span style="color: #007700">);<br /> }<br />}<br /><br /></span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();<br /><br />echo </span><span style="color: #DD0000">"step 1\n"</span><span style="color: #007700">;<br /></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">,<br /> </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">);<br />if (!</span><span style="color: #0000BB">$bev</span><span style="color: #007700">) {<br /> exit(</span><span style="color: #DD0000">"Failed creating bufferevent socket\n"</span><span style="color: #007700">);<br />}<br /><br />echo </span><span style="color: #DD0000">"step 2\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></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">);<br /></span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></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">);<br /><br />echo </span><span style="color: #DD0000">"step 3\n"</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Send request<br /></span><span style="color: #0000BB">$output </span><span style="color: #007700">= </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">getOutput</span><span style="color: #007700">();<br />if (!</span><span style="color: #0000BB">$output</span><span style="color: #007700">-></span><span style="color: #0000BB">add</span><span style="color: #007700">(<br /> </span><span style="color: #DD0000">"GET /index.cphp HTTP/1.0\r\n"</span><span style="color: #007700">.<br /> </span><span style="color: #DD0000">"Connection: Close\r\n\r\n"<br /></span><span style="color: #007700">)) {<br /> exit(</span><span style="color: #DD0000">"Failed adding request to output buffer\n"</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #FF8000">/* Connect to the host syncronously.<br />We know the IP, and don't need to resolve DNS. */<br /></span><span style="color: #007700">if (!</span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></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">)) {<br /> exit(</span><span style="color: #DD0000">"Can't connect to host\n"</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #FF8000">// Dispatch pending events<br /></span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> <div class="example" id="example-4236"> <p><strong>Example #3 Echo server</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">/*<br /> * Simple echo server based on libevent's connection listener.<br /> *<br /> * Usage:<br /> * 1) In one terminal window run:<br /> *<br /> * $ php listener.php 9881<br /> *<br /> * 2) In another terminal window open up connection, e.g.:<br /> *<br /> * $ nc 127.0.0.1 9881<br /> *<br /> * 3) start typing. The server should repeat the input.<br /> */<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyListenerConnection </span><span style="color: #007700">{<br /> private </span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">;<br /><br /> public function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev</span><span style="color: #007700">-></span><span style="color: #0000BB">free</span><span style="color: #007700">();<br /> }<br /><br /> public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base </span><span style="color: #007700">= </span><span style="color: #0000BB">$base</span><span style="color: #007700">;<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">, </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_CLOSE_ON_FREE</span><span style="color: #007700">);<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev</span><span style="color: #007700">-></span><span style="color: #0000BB">setCallbacks</span><span style="color: #007700">(array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"echoReadCallback"</span><span style="color: #007700">), </span><span style="color: #0000BB">NULL</span><span style="color: #007700">,<br /> array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"echoEventCallback"</span><span style="color: #007700">), </span><span style="color: #0000BB">NULL</span><span style="color: #007700">);<br /><br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev</span><span style="color: #007700">-></span><span style="color: #0000BB">enable</span><span style="color: #007700">(</span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">READ</span><span style="color: #007700">)) {<br /> echo </span><span style="color: #DD0000">"Failed to enable READ\n"</span><span style="color: #007700">;<br /> return;<br /> }<br /> }<br /><br /> public function </span><span style="color: #0000BB">echoReadCallback</span><span style="color: #007700">(</span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br /> </span><span style="color: #FF8000">// Copy all the data from the input buffer to the output buffer<br /> <br /> // Variant #1<br /> </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">output</span><span style="color: #007700">-></span><span style="color: #0000BB">addBuffer</span><span style="color: #007700">(</span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">input</span><span style="color: #007700">);<br /><br /> </span><span style="color: #FF8000">/* Variant #2 */<br /> /*<br /> $input = $bev->getInput();<br /> $output = $bev->getOutput();<br /> $output->addBuffer($input);<br /> */<br /> </span><span style="color: #007700">}<br /><br /> public function </span><span style="color: #0000BB">echoEventCallback</span><span style="color: #007700">(</span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$events</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br /> if (</span><span style="color: #0000BB">$events </span><span style="color: #007700">& </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">ERROR</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Error from bufferevent\n"</span><span style="color: #007700">;<br /> }<br /><br /> if (</span><span style="color: #0000BB">$events </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">| </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">ERROR</span><span style="color: #007700">)) {<br /> </span><span style="color: #FF8000">//$bev->free();<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">__destruct</span><span style="color: #007700">();<br /> }<br /> }<br />}<br /><br />class </span><span style="color: #0000BB">MyListener </span><span style="color: #007700">{<br /> public </span><span style="color: #0000BB">$base</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$listener</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$socket</span><span style="color: #007700">;<br /> private </span><span style="color: #0000BB">$conn </span><span style="color: #007700">= array();<br /><br /> public function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {<br /> foreach (</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">conn </span><span style="color: #007700">as &</span><span style="color: #0000BB">$c</span><span style="color: #007700">) </span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br /> }<br /><br /> public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$port</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();<br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Couldn't open event base"</span><span style="color: #007700">;<br /> exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #FF8000">// Variant #1<br /> /*<br /> $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);<br /> if (!socket_bind($this->socket, '0.0.0.0', $port)) {<br /> echo "Unable to bind socket\n";<br /> exit(1);<br /> }<br /> $this->listener = new EventListener($this->base,<br /> array($this, "acceptConnCallback"), $this->base,<br /> EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,<br /> -1, $this->socket);<br /> */<br /><br /> // Variant #2<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></span><span style="color: #0000BB">base</span><span style="color: #007700">,<br /> array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"acceptConnCallback"</span><span style="color: #007700">), </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventListener</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_CLOSE_ON_FREE </span><span style="color: #007700">| </span><span style="color: #0000BB">EventListener</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_REUSEABLE</span><span style="color: #007700">, -</span><span style="color: #0000BB">1</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"0.0.0.0:</span><span style="color: #0000BB">$port</span><span style="color: #DD0000">"</span><span style="color: #007700">);<br /><br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">listener</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Couldn't create listener"</span><span style="color: #007700">;<br /> exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">listener</span><span style="color: #007700">-></span><span style="color: #0000BB">setErrorCallback</span><span style="color: #007700">(array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"accept_error_cb"</span><span style="color: #007700">));<br /> }<br /><br /> public function </span><span style="color: #0000BB">dispatch</span><span style="color: #007700">() {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">-></span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br /> }<br /><br /> </span><span style="color: #FF8000">// This callback is invoked when there is data to read on $bev<br /> </span><span style="color: #007700">public function </span><span style="color: #0000BB">acceptConnCallback</span><span style="color: #007700">(</span><span style="color: #0000BB">$listener</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">, </span><span style="color: #0000BB">$address</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br /> </span><span style="color: #FF8000">// We got a new connection! Set up a bufferevent for it. */<br /> </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: #0000BB">base</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">conn</span><span style="color: #007700">[] = new </span><span style="color: #0000BB">MyListenerConnection</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">);<br /> }<br /><br /> public function </span><span style="color: #0000BB">accept_error_cb</span><span style="color: #007700">(</span><span style="color: #0000BB">$listener</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$base </span><span style="color: #007700">= </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">;<br /><br /> </span><span style="color: #0000BB">fprintf</span><span style="color: #007700">(</span><span style="color: #0000BB">STDERR</span><span style="color: #007700">, </span><span style="color: #DD0000">"Got an error %d (%s) on the listener. "<br /> </span><span style="color: #007700">.</span><span style="color: #DD0000">"Shutting down.\n"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketErrno</span><span style="color: #007700">(),<br /> </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketError</span><span style="color: #007700">());<br /><br /> </span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);<br /> }<br />}<br /><br /></span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">9808</span><span style="color: #007700">;<br /><br />if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">> </span><span style="color: #0000BB">1</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$port </span><span style="color: #007700">= (int) </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br />}<br />if (</span><span style="color: #0000BB">$port </span><span style="color: #007700"><= </span><span style="color: #0000BB">0 </span><span style="color: #007700">|| </span><span style="color: #0000BB">$port </span><span style="color: #007700">> </span><span style="color: #0000BB">65535</span><span style="color: #007700">) {<br /> exit(</span><span style="color: #DD0000">"Invalid port"</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">$l </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyListener</span><span style="color: #007700">(</span><span style="color: #0000BB">$port</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$l</span><span style="color: #007700">-></span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> <div class="example" id="example-4237"> <p><strong>Example #4 SSL echo server</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">/*<br /> * SSL echo server<br /> *<br /> * To test:<br /> * 1) Run:<br /> * $ php examples/ssl-echo-server/server.php 9998<br /> *<br /> * 2) in another terminal window run:<br /> * $ socat - SSL:127.0.0.1:9998,verify=1,cafile=examples/ssl-echo-server/cert.pem<br /> */<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MySslEchoServer </span><span style="color: #007700">{<br /> public </span><span style="color: #0000BB">$port</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$base</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$bev</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$listener</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">;<br /><br /> 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">) {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">port </span><span style="color: #007700">= </span><span style="color: #0000BB">$port</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">ctx </span><span style="color: #007700">= </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">init_ssl</span><span style="color: #007700">();<br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">ctx</span><span style="color: #007700">) {<br /> exit(</span><span style="color: #DD0000">"Failed creating SSL context\n"</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #0000BB">$this</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">();<br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">) {<br /> exit(</span><span style="color: #DD0000">"Couldn't open event base\n"</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></span><span style="color: #0000BB">base</span><span style="color: #007700">,<br /> array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"ssl_accept_cb"</span><span style="color: #007700">), </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">ctx</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventListener</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_CLOSE_ON_FREE </span><span style="color: #007700">| </span><span style="color: #0000BB">EventListener</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_REUSEABLE</span><span style="color: #007700">,<br /> -</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">);<br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">listener</span><span style="color: #007700">) {<br /> exit(</span><span style="color: #DD0000">"Couldn't create listener\n"</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">listener</span><span style="color: #007700">-></span><span style="color: #0000BB">setErrorCallback</span><span style="color: #007700">(array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"accept_error_cb"</span><span style="color: #007700">));<br /> }<br /> function </span><span style="color: #0000BB">dispatch</span><span style="color: #007700">() {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">-></span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br /> }<br /><br /> </span><span style="color: #FF8000">// This callback is invoked when there is data to read on $bev.<br /> </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">) {<br /> </span><span style="color: #0000BB">$in </span><span style="color: #007700">= </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">input</span><span style="color: #007700">; </span><span style="color: #FF8000">//$bev->getInput();<br /><br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"Received %zu bytes\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">$in</span><span style="color: #007700">-></span><span style="color: #0000BB">length</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"----- data ----\n"</span><span style="color: #007700">);<br /> </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">-></span><span style="color: #0000BB">length</span><span style="color: #007700">, </span><span style="color: #0000BB">$in</span><span style="color: #007700">-></span><span style="color: #0000BB">pullup</span><span style="color: #007700">(-</span><span style="color: #0000BB">1</span><span style="color: #007700">));<br /><br /> </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">writeBuffer</span><span style="color: #007700">(</span><span style="color: #0000BB">$in</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #FF8000">// This callback is invoked when some even occurs on the event listener,<br /> // e.g. connection closed, or an error occured<br /> </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">) {<br /> if (</span><span style="color: #0000BB">$events </span><span style="color: #007700">& </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">ERROR</span><span style="color: #007700">) {<br /> </span><span style="color: #FF8000">// Fetch errors from the SSL error stack<br /> </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">-></span><span style="color: #0000BB">sslError</span><span style="color: #007700">()) {<br /> </span><span style="color: #0000BB">fprintf</span><span style="color: #007700">(</span><span style="color: #0000BB">STDERR</span><span style="color: #007700">, </span><span style="color: #DD0000">"Bufferevent error %s.\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">$err</span><span style="color: #007700">);<br /> }<br /> }<br /><br /> if (</span><span style="color: #0000BB">$events </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">| </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">ERROR</span><span style="color: #007700">)) {<br /> </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">free</span><span style="color: #007700">();<br /> }<br /> }<br /><br /> </span><span style="color: #FF8000">// This callback is invoked when a client accepts new connection<br /> </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">) {<br /> </span><span style="color: #FF8000">// We got a new connection! Set up a bufferevent for it.<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></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">-></span><span style="color: #0000BB">ctx</span><span style="color: #007700">,<br /> </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">);<br /><br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Failed creating ssl buffer\n"</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">-></span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);<br /> exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev</span><span style="color: #007700">-></span><span style="color: #0000BB">enable</span><span style="color: #007700">(</span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">READ</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev</span><span style="color: #007700">-></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">,<br /> 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">);<br /> }<br /><br /> </span><span style="color: #FF8000">// This callback is invoked when we failed to setup new connection for a client<br /> </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">) {<br /> </span><span style="color: #0000BB">fprintf</span><span style="color: #007700">(</span><span style="color: #0000BB">STDERR</span><span style="color: #007700">, </span><span style="color: #DD0000">"Got an error %d (%s) on the listener. "<br /> </span><span style="color: #007700">.</span><span style="color: #DD0000">"Shutting down.\n"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketErrno</span><span style="color: #007700">(),<br /> </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketError</span><span style="color: #007700">());<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">-></span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #FF8000">// Initialize SSL structures, create an EventSslContext<br /> // Optionally create self-signed certificates<br /> </span><span style="color: #007700">function </span><span style="color: #0000BB">init_ssl</span><span style="color: #007700">() {<br /> </span><span style="color: #FF8000">// We *must* have entropy. Otherwise there's no point to crypto.<br /> </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">()) {<br /> exit(</span><span style="color: #DD0000">"EventUtil::sslRandPoll failed\n"</span><span style="color: #007700">);<br /> }<br /><br /> </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">;<br /> </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">;<br /><br /> 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">)) {<br /> echo </span><span style="color: #DD0000">"Couldn't read </span><span style="color: #0000BB">$local_cert</span><span style="color: #DD0000"> or </span><span style="color: #0000BB">$local_pk</span><span style="color: #DD0000"> file. To generate a key\n"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"and self-signed certificate, run:\n"</span><span style="color: #007700">,<br /> </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">,<br /> </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">,<br /> </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">;<br /><br /> return </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">;<br /> }<br /><br /> </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 (<br /> </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_LOCAL_CERT </span><span style="color: #007700">=> </span><span style="color: #0000BB">$local_cert</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_LOCAL_PK </span><span style="color: #007700">=> </span><span style="color: #0000BB">$local_pk</span><span style="color: #007700">,<br /> </span><span style="color: #FF8000">//EventSslContext::OPT_PASSPHRASE => "echo server",<br /> </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_VERIFY_PEER </span><span style="color: #007700">=> </span><span style="color: #0000BB">true</span><span style="color: #007700">,<br /> </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">=> </span><span style="color: #0000BB">false</span><span style="color: #007700">,<br /> ));<br /><br /> return </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">;<br /> }<br />}<br /><br /></span><span style="color: #FF8000">// Allow to override the port<br /></span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">9999</span><span style="color: #007700">;<br />if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">> </span><span style="color: #0000BB">1</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$port </span><span style="color: #007700">= (int) </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br />}<br />if (</span><span style="color: #0000BB">$port </span><span style="color: #007700"><= </span><span style="color: #0000BB">0 </span><span style="color: #007700">|| </span><span style="color: #0000BB">$port </span><span style="color: #007700">> </span><span style="color: #0000BB">65535</span><span style="color: #007700">) {<br /> exit(</span><span style="color: #DD0000">"Invalid port\n"</span><span style="color: #007700">);<br />}<br /><br /><br /></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">);<br /></span><span style="color: #0000BB">$l</span><span style="color: #007700">-></span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> <div class="example" id="example-4238"> <p><strong>Example #5 Signal handler</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">/*<br />Launch it in a terminal window:<br /><br />$ php examples/signal.php<br /><br />In another terminal window find out the pid and send SIGTERM, e.g.:<br /><br />$ ps aux | grep examp<br />ruslan 3976 0.2 0.0 139896 11256 pts/1 S+ 10:25 0:00 php examples/signal.php<br />ruslan 3978 0.0 0.0 9572 864 pts/2 S+ 10:26 0:00 grep --color=auto examp<br />$ kill -TERM 3976<br /><br />At the first terminal window you should catch the following:<br /><br />Caught signal 15<br />*/<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyEventSignal </span><span style="color: #007700">{<br /> private </span><span style="color: #0000BB">$base</span><span style="color: #007700">;<br /><br /> function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base </span><span style="color: #007700">= </span><span style="color: #0000BB">$base</span><span style="color: #007700">;<br /> }<br /><br /> 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">) {<br /> echo </span><span style="color: #DD0000">"Caught signal </span><span style="color: #0000BB">$no</span><span style="color: #DD0000">\n"</span><span style="color: #007700">; <br /> </span><span style="color: #0000BB">event_base_loopexit</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">);<br /> }<br />}<br /><br /></span><span style="color: #0000BB">$base </span><span style="color: #007700">= </span><span style="color: #0000BB">event_base_new</span><span style="color: #007700">();<br /></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">);<br /></span><span style="color: #0000BB">$no </span><span style="color: #007700">= </span><span style="color: #0000BB">SIGTERM</span><span style="color: #007700">;<br /></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">);<br /><br /></span><span style="color: #0000BB">evsignal_add</span><span style="color: #007700">(</span><span style="color: #0000BB">$ev</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">event_base_loop</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> <div class="example" id="example-4239"> <p><strong>Example #6 Use libevent's loop to process requests of `eio' extension</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// Callback for eio_nop()<br /></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">) {<br /> echo </span><span style="color: #DD0000">"step 6\n"</span><span style="color: #007700">;<br />}<br /><br /></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">;<br />if (</span><span style="color: #0000BB">file_exists</span><span style="color: #007700">(</span><span style="color: #0000BB">$dir</span><span style="color: #007700">)) {<br /> </span><span style="color: #0000BB">rmdir</span><span style="color: #007700">(</span><span style="color: #0000BB">$dir</span><span style="color: #007700">);<br />}<br /><br />echo </span><span style="color: #DD0000">"step 1\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();<br /><br />echo </span><span style="color: #DD0000">"step 2\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">eio_init</span><span style="color: #007700">();<br /><br /></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">);<br /><br /></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">(),<br /> </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">) {<br /> echo </span><span style="color: #DD0000">"step 5\n"</span><span style="color: #007700">;<br /><br /> while (</span><span style="color: #0000BB">eio_nreqs</span><span style="color: #007700">()) {<br /> </span><span style="color: #0000BB">eio_poll</span><span style="color: #007700">();<br /> }<br /><br /> </span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">stop</span><span style="color: #007700">();<br />}, </span><span style="color: #0000BB">$base</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">"step 3\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$event</span><span style="color: #007700">-></span><span style="color: #0000BB">add</span><span style="color: #007700">();<br /><br />echo </span><span style="color: #DD0000">"step 4\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br /><br />echo </span><span style="color: #DD0000">"Done\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> <div class="example" id="example-4240"> <p><strong>Example #7 Miscellaneous</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">/* {{{ Config & supported stuff */<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Supported methods:\n"</span><span style="color: #007700">;<br />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">) {<br /> echo </span><span style="color: #0000BB">$m</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Avoiding "select" method<br /></span><span style="color: #0000BB">$cfg </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventConfig</span><span style="color: #007700">();<br />if (</span><span style="color: #0000BB">$cfg</span><span style="color: #007700">-></span><span style="color: #0000BB">avoidMethod</span><span style="color: #007700">(</span><span style="color: #DD0000">"select"</span><span style="color: #007700">)) {<br /> echo </span><span style="color: #DD0000">"`select' method avoided\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Create event_base associated with the config<br /></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">);<br />echo </span><span style="color: #DD0000">"Event method used: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">getMethod</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"Features:\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$features </span><span style="color: #007700">= </span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">getFeatures</span><span style="color: #007700">();<br />(</span><span style="color: #0000BB">$features </span><span style="color: #007700">& </span><span style="color: #0000BB">EventConfig</span><span style="color: #007700">::</span><span style="color: #0000BB">FEATURE_ET</span><span style="color: #007700">) and print(</span><span style="color: #DD0000">"ET - edge-triggered IO\n"</span><span style="color: #007700">);<br />(</span><span style="color: #0000BB">$features </span><span style="color: #007700">& </span><span style="color: #0000BB">EventConfig</span><span style="color: #007700">::</span><span style="color: #0000BB">FEATURE_O1</span><span style="color: #007700">) and print(</span><span style="color: #DD0000">"O1 - O(1) operation for adding/deletting events\n"</span><span style="color: #007700">);<br />(</span><span style="color: #0000BB">$features </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">) and print(</span><span style="color: #DD0000">"FDS - arbitrary file descriptor types, and not just sockets\n"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Require FDS feature<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$cfg</span><span style="color: #007700">-></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">)) {<br /> echo </span><span style="color: #DD0000">"FDS feature is now requried\n"</span><span style="color: #007700">;<br /><br /> </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">);<br /> (</span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">getFeatures</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">)<br /> and print(</span><span style="color: #DD0000">"FDS - arbitrary file descriptor types, and not just sockets\n"</span><span style="color: #007700">);<br />}<br /></span><span style="color: #FF8000">/* }}} */<br /><br />/* {{{ Base */<br /></span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();<br /></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">) {<br /> static </span><span style="color: #0000BB">$max_iterations </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /><br /> if (++</span><span style="color: #0000BB">$max_iterations </span><span style="color: #007700">>= </span><span style="color: #0000BB">5</span><span style="color: #007700">) {<br /> </span><span style="color: #FF8000">/* exit after 5 iterations with timeout of 2.33 seconds */<br /> </span><span style="color: #007700">echo </span><span style="color: #DD0000">"Stopping...\n"</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$arg</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]-></span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">2.33</span><span style="color: #007700">);<br /> }<br /><br /> echo </span><span style="color: #0000BB">fgets</span><span style="color: #007700">(</span><span style="color: #0000BB">$fd</span><span style="color: #007700">);<br />}, array (&</span><span style="color: #0000BB">$base</span><span style="color: #007700">));<br /><br /></span><span style="color: #0000BB">$event</span><span style="color: #007700">-></span><span style="color: #0000BB">add</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">loop</span><span style="color: #007700">();<br /></span><span style="color: #FF8000">/* Base }}} */<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> <div class="example" id="example-4241"> <p><strong>Example #8 Simple HTTP server</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">/*<br /> * Simple HTTP server.<br /> *<br /> * To test it:<br /> * 1) Run it on a port of your choice, e.g.:<br /> * $ php examples/http.php 8010<br /> * 2) In another terminal connect to some address on this port<br /> * and make GET or POST request(others are turned off here), e.g.:<br /> * $ nc -t 127.0.0.1 8010<br /> * POST /about HTTP/1.0<br /> * Content-Type: text/plain<br /> * Content-Length: 4<br /> * Connection: close<br /> * (press Enter)<br /> *<br /> * It will output<br /> * a=12<br /> * HTTP/1.0 200 OK<br /> * Content-Type: text/html; charset=ISO-8859-1<br /> * Connection: close<br /> *<br /> * $ nc -t 127.0.0.1 8010<br /> * GET /dump HTTP/1.0<br /> * Content-Type: text/plain<br /> * Content-Encoding: UTF-8<br /> * Connection: close<br /> * (press Enter)<br /> *<br /> * It will output:<br /> * HTTP/1.0 200 OK<br /> * Content-Type: text/html; charset=ISO-8859-1<br /> * Connection: close<br /> * (press Enter)<br /> *<br /> * $ nc -t 127.0.0.1 8010<br /> * GET /unknown HTTP/1.0<br /> * Connection: close<br /> *<br /> * It will output:<br /> * HTTP/1.0 200 OK<br /> * Content-Type: text/html; charset=ISO-8859-1<br /> * Connection: close<br /> *<br /> * 3) See what the server outputs on the previous terminal window.<br /> */<br /><br /></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">) {<br /> static </span><span style="color: #0000BB">$counter </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /> static </span><span style="color: #0000BB">$max_requests </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /><br /> if (++</span><span style="color: #0000BB">$counter </span><span style="color: #007700">>= </span><span style="color: #0000BB">$max_requests</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Counter reached max requests </span><span style="color: #0000BB">$max_requests</span><span style="color: #DD0000">. Exiting\n"</span><span style="color: #007700">;<br /> exit();<br /> }<br /><br /> echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #DD0000">" called\n"</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"request:"</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">);<br /> echo </span><span style="color: #DD0000">"data:"</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">);<br /><br /> echo </span><span style="color: #DD0000">"\n===== DUMP =====\n"</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"Command:"</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-></span><span style="color: #0000BB">getCommand</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"URI:"</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-></span><span style="color: #0000BB">getUri</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"Input headers:"</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">-></span><span style="color: #0000BB">getInputHeaders</span><span style="color: #007700">());<br /> echo </span><span style="color: #DD0000">"Output headers:"</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">-></span><span style="color: #0000BB">getOutputHeaders</span><span style="color: #007700">());<br /><br /> echo </span><span style="color: #DD0000">"\n >> Sending reply ..."</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$req</span><span style="color: #007700">-></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">);<br /> echo </span><span style="color: #DD0000">"OK\n"</span><span style="color: #007700">;<br /><br /> echo </span><span style="color: #DD0000">"\n >> Reading input buffer ...\n"</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$buf </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-></span><span style="color: #0000BB">getInputBuffer</span><span style="color: #007700">();<br /> while (</span><span style="color: #0000BB">$s </span><span style="color: #007700">= </span><span style="color: #0000BB">$buf</span><span style="color: #007700">-></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">)) {<br /> echo </span><span style="color: #0000BB">$s</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /> }<br /> echo </span><span style="color: #DD0000">"No more data in the buffer\n"</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">_http_about</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">) {<br /> echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"URI: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-></span><span style="color: #0000BB">getUri</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"\n >> Sending reply ..."</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$req</span><span style="color: #007700">-></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">);<br /> echo </span><span style="color: #DD0000">"OK\n"</span><span style="color: #007700">;<br />}<br /><br />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">) {<br /> echo </span><span style="color: #0000BB">__METHOD__</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"URI: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$req</span><span style="color: #007700">-></span><span style="color: #0000BB">getUri</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"\n >> Sending reply ..."</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$req</span><span style="color: #007700">-></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">);<br /> echo </span><span style="color: #DD0000">"OK\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">8010</span><span style="color: #007700">;<br />if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">> </span><span style="color: #0000BB">1</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$port </span><span style="color: #007700">= (int) </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br />}<br />if (</span><span style="color: #0000BB">$port </span><span style="color: #007700"><= </span><span style="color: #0000BB">0 </span><span style="color: #007700">|| </span><span style="color: #0000BB">$port </span><span style="color: #007700">> </span><span style="color: #0000BB">65535</span><span style="color: #007700">) {<br /> exit(</span><span style="color: #DD0000">"Invalid port"</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();<br /></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">);<br /></span><span style="color: #0000BB">$http</span><span style="color: #007700">-></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">);<br /><br /></span><span style="color: #0000BB">$http</span><span style="color: #007700">-></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">));<br /></span><span style="color: #0000BB">$http</span><span style="color: #007700">-></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">);<br /></span><span style="color: #0000BB">$http</span><span style="color: #007700">-></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">"custom data value"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$http</span><span style="color: #007700">-></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">);<br /></span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">loop</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output something similar to:</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-4242"> <p><strong>Example #9 <span class="function"><a href="eventhttpconnection.makerequest.html" class="function">EventHttpConnection::makeRequest()</a></span> example</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></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">) {<br /> echo </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /> if (</span><span style="color: #0000BB">is_null</span><span style="color: #007700">(</span><span style="color: #0000BB">$req</span><span style="color: #007700">)) {<br /> echo </span><span style="color: #DD0000">"Timed out\n"</span><span style="color: #007700">;<br /> } else {<br /> </span><span style="color: #0000BB">$response_code </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-></span><span style="color: #0000BB">getResponseCode</span><span style="color: #007700">();<br /><br /> if (</span><span style="color: #0000BB">$response_code </span><span style="color: #007700">== </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Connection refused\n"</span><span style="color: #007700">;<br /> } elseif (</span><span style="color: #0000BB">$response_code </span><span style="color: #007700">!= </span><span style="color: #0000BB">200</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Unexpected response: </span><span style="color: #0000BB">$response_code</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br /> } else {<br /> echo </span><span style="color: #DD0000">"Success: </span><span style="color: #0000BB">$response_code</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$buf </span><span style="color: #007700">= </span><span style="color: #0000BB">$req</span><span style="color: #007700">-></span><span style="color: #0000BB">getInputBuffer</span><span style="color: #007700">();<br /> echo </span><span style="color: #DD0000">"Body:\n"</span><span style="color: #007700">;<br /> while (</span><span style="color: #0000BB">$s </span><span style="color: #007700">= </span><span style="color: #0000BB">$buf</span><span style="color: #007700">-></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">)) {<br /> echo </span><span style="color: #0000BB">$s</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /> }<br /> }<br /> }<br /> <br /> </span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);<br />}<br /><br /></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">;<br /></span><span style="color: #0000BB">$port </span><span style="color: #007700">= </span><span style="color: #0000BB">80</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$base </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBase</span><span style="color: #007700">();<br /></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">);<br /></span><span style="color: #0000BB">$conn</span><span style="color: #007700">-></span><span style="color: #0000BB">setTimeout</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">);<br /></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">);<br /><br /></span><span style="color: #0000BB">$req</span><span style="color: #007700">-></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">);<br /></span><span style="color: #0000BB">$req</span><span style="color: #007700">-></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">);<br /></span><span style="color: #0000BB">$conn</span><span style="color: #007700">-></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">);<br /><br /></span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">loop</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output something similar to:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> _request_handler Success: 200 Body: PHP, date: 2013-03-13T20:27:52+05:00 </pre></div> </div> </div> <div class="example" id="example-4243"> <p><strong>Example #10 Connection listener based on a UNIX domain socket</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">/*<br /> * Simple echo server based on libevent's connection listener.<br /> *<br /> * Usage:<br /> * 1) In one terminal window run:<br /> *<br /> * $ php unix-domain-listener.php [path-to-socket]<br /> *<br /> * 2) In another terminal window open up connection<br /> * to the socket, e.g.:<br /> *<br /> * $ socat - GOPEN:/tmp/1.sock<br /> *<br /> * 3) Start typing. The server should repeat the input.<br /> */<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyListenerConnection </span><span style="color: #007700">{<br /> private </span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">;<br /><br /> public function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {<br /> if (</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev</span><span style="color: #007700">-></span><span style="color: #0000BB">free</span><span style="color: #007700">();<br /> }<br /> }<br /><br /> public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base </span><span style="color: #007700">= </span><span style="color: #0000BB">$base</span><span style="color: #007700">;<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev </span><span style="color: #007700">= new </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">, </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_CLOSE_ON_FREE</span><span style="color: #007700">);<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev</span><span style="color: #007700">-></span><span style="color: #0000BB">setCallbacks</span><span style="color: #007700">(array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"echoReadCallback"</span><span style="color: #007700">), </span><span style="color: #0000BB">NULL</span><span style="color: #007700">,<br /> array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"echoEventCallback"</span><span style="color: #007700">), </span><span style="color: #0000BB">NULL</span><span style="color: #007700">);<br /><br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">bev</span><span style="color: #007700">-></span><span style="color: #0000BB">enable</span><span style="color: #007700">(</span><span style="color: #0000BB">Event</span><span style="color: #007700">::</span><span style="color: #0000BB">READ</span><span style="color: #007700">)) {<br /> echo </span><span style="color: #DD0000">"Failed to enable READ\n"</span><span style="color: #007700">;<br /> return;<br /> }<br /> }<br /><br /> public function </span><span style="color: #0000BB">echoReadCallback</span><span style="color: #007700">(</span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br /> </span><span style="color: #FF8000">// Copy all the data from the input buffer to the output buffer<br /> </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">output</span><span style="color: #007700">-></span><span style="color: #0000BB">addBuffer</span><span style="color: #007700">(</span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">input</span><span style="color: #007700">);<br /> }<br /><br /> public function </span><span style="color: #0000BB">echoEventCallback</span><span style="color: #007700">(</span><span style="color: #0000BB">$bev</span><span style="color: #007700">, </span><span style="color: #0000BB">$events</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br /> if (</span><span style="color: #0000BB">$events </span><span style="color: #007700">& </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">ERROR</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Error from bufferevent\n"</span><span style="color: #007700">;<br /> }<br /><br /> if (</span><span style="color: #0000BB">$events </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">| </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">ERROR</span><span style="color: #007700">)) {<br /> </span><span style="color: #0000BB">$bev</span><span style="color: #007700">-></span><span style="color: #0000BB">free</span><span style="color: #007700">();<br /> </span><span style="color: #0000BB">$bev </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br /> }<br /> }<br />}<br /><br />class </span><span style="color: #0000BB">MyListener </span><span style="color: #007700">{<br /> public </span><span style="color: #0000BB">$base</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$listener</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$socket</span><span style="color: #007700">;<br /> private </span><span style="color: #0000BB">$conn </span><span style="color: #007700">= array();<br /><br /> public function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {<br /> foreach (</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">conn </span><span style="color: #007700">as &</span><span style="color: #0000BB">$c</span><span style="color: #007700">) </span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br /> }<br /><br /> public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$sock_path</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$this</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">();<br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Couldn't open event base"</span><span style="color: #007700">;<br /> exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /> }<br /><br /> 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">)) {<br /> </span><span style="color: #0000BB">unlink</span><span style="color: #007700">(</span><span style="color: #0000BB">$sock_path</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></span><span style="color: #0000BB">base</span><span style="color: #007700">,<br /> array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"acceptConnCallback"</span><span style="color: #007700">), </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventListener</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_CLOSE_ON_FREE </span><span style="color: #007700">| </span><span style="color: #0000BB">EventListener</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_REUSEABLE</span><span style="color: #007700">, -</span><span style="color: #0000BB">1</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"unix:</span><span style="color: #0000BB">$sock_path</span><span style="color: #DD0000">"</span><span style="color: #007700">);<br /><br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">listener</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">trigger_error</span><span style="color: #007700">(</span><span style="color: #DD0000">"Couldn't create listener"</span><span style="color: #007700">, </span><span style="color: #0000BB">E_USER_ERROR</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">listener</span><span style="color: #007700">-></span><span style="color: #0000BB">setErrorCallback</span><span style="color: #007700">(array(</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">"accept_error_cb"</span><span style="color: #007700">));<br /> }<br /><br /> public function </span><span style="color: #0000BB">dispatch</span><span style="color: #007700">() {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">-></span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br /> }<br /><br /> </span><span style="color: #FF8000">// This callback is invoked when there is data to read on $bev<br /> </span><span style="color: #007700">public function </span><span style="color: #0000BB">acceptConnCallback</span><span style="color: #007700">(</span><span style="color: #0000BB">$listener</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">, </span><span style="color: #0000BB">$address</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br /> </span><span style="color: #FF8000">// We got a new connection! Set up a bufferevent for it. */<br /> </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: #0000BB">base</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">conn</span><span style="color: #007700">[] = new </span><span style="color: #0000BB">MyListenerConnection</span><span style="color: #007700">(</span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">);<br /> }<br /><br /> public function </span><span style="color: #0000BB">accept_error_cb</span><span style="color: #007700">(</span><span style="color: #0000BB">$listener</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$base </span><span style="color: #007700">= </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">;<br /><br /> </span><span style="color: #0000BB">fprintf</span><span style="color: #007700">(</span><span style="color: #0000BB">STDERR</span><span style="color: #007700">, </span><span style="color: #DD0000">"Got an error %d (%s) on the listener. "<br /> </span><span style="color: #007700">.</span><span style="color: #DD0000">"Shutting down.\n"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketErrno</span><span style="color: #007700">(),<br /> </span><span style="color: #0000BB">EventUtil</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastSocketError</span><span style="color: #007700">());<br /><br /> </span><span style="color: #0000BB">$base</span><span style="color: #007700">-></span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);<br /> }<br />}<br /><br />if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700"><= </span><span style="color: #0000BB">1</span><span style="color: #007700">) {<br /> exit(</span><span style="color: #DD0000">"Socket path is not provided\n"</span><span style="color: #007700">);<br />}<br /></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">];<br /><br /></span><span style="color: #0000BB">$l </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyListener</span><span style="color: #007700">(</span><span style="color: #0000BB">$sock_path</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$l</span><span style="color: #007700">-></span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> <div class="example" id="event.example.smtp"> <p><strong>Example #11 Simple SMTP server</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /> </span><span style="color: #FF8000">/* <br /> * Author: Andrew Rose <hello at andrewrose dot co dot uk><br /> *<br /> * Usage:<br /> * 1) Prepare cert.pem certificate and privkey.pem private key files.<br /> * 2) Launch the server script<br /> * 3) Open TLS connection, e.g.:<br /> * $ openssl s_client -connect localhost:25 -starttls smtp -crlf<br /> * 4) Start testing the commands listed in `cmd` method below.<br /> */<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Handler </span><span style="color: #007700">{<br /> public </span><span style="color: #0000BB">$domainName </span><span style="color: #007700">= </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">;<br /> public </span><span style="color: #0000BB">$connections </span><span style="color: #007700">= [];<br /> public </span><span style="color: #0000BB">$buffers </span><span style="color: #007700">= [];<br /> public </span><span style="color: #0000BB">$maxRead </span><span style="color: #007700">= </span><span style="color: #0000BB">256000</span><span style="color: #007700">;<br /><br /> public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<br /> </span><span style="color: #0000BB">$this</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">, [<br /> </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_LOCAL_CERT </span><span style="color: #007700">=> </span><span style="color: #DD0000">'cert.pem'</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_LOCAL_PK </span><span style="color: #007700">=> </span><span style="color: #DD0000">'privkey.pem'</span><span style="color: #007700">,<br /> </span><span style="color: #FF8000">//EventSslContext::OPT_PASSPHRASE => '',<br /> </span><span style="color: #0000BB">EventSslContext</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_VERIFY_PEER </span><span style="color: #007700">=> </span><span style="color: #0000BB">false</span><span style="color: #007700">, </span><span style="color: #FF8000">// change to true with authentic cert<br /> </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">=> </span><span style="color: #0000BB">true </span><span style="color: #FF8000">// change to false with authentic cert<br /> </span><span style="color: #007700">]);<br /><br /> </span><span style="color: #0000BB">$this</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">();<br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">) {<br /> exit(</span><span style="color: #DD0000">"Couldn't open event base\n"</span><span style="color: #007700">);<br /> }<br /><br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></span><span style="color: #0000BB">base</span><span style="color: #007700">,<br /> [</span><span style="color: #0000BB">$this</span><span style="color: #007700">, </span><span style="color: #DD0000">'ev_accept'</span><span style="color: #007700">],<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">ctx</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventListener</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_CLOSE_ON_FREE </span><span style="color: #007700">| </span><span style="color: #0000BB">EventListener</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_REUSEABLE</span><span style="color: #007700">,<br /> -</span><span style="color: #0000BB">1</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'0.0.0.0:25'</span><span style="color: #007700">))<br /> {<br /> exit(</span><span style="color: #DD0000">"Couldn't create listener\n"</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">listener</span><span style="color: #007700">-></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">]);<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">-></span><span style="color: #0000BB">dispatch</span><span style="color: #007700">();<br /> }<br /><br /> 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">) {<br /> static </span><span style="color: #0000BB">$id </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$id </span><span style="color: #007700">+= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">;<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></span><span style="color: #0000BB">base</span><span style="color: #007700">, </span><span style="color: #0000BB">$fd</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_CLOSE_ON_FREE</span><span style="color: #007700">);<br /><br /> if (!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">]) {<br /> echo </span><span style="color: #DD0000">"Failed creating buffer\n"</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">-></span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);<br /> exit(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /> }<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">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">,<br /> [</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">);<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">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">);<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></span><span style="color: #0000BB">domainName</span><span style="color: #007700">.</span><span style="color: #DD0000">" wazzzap?\r\n"</span><span style="color: #007700">);<br /> }<br /><br /> 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">) {<br /> </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">();<br /><br /> </span><span style="color: #0000BB">fprintf</span><span style="color: #007700">(</span><span style="color: #0000BB">STDERR</span><span style="color: #007700">, </span><span style="color: #DD0000">"Got an error %d (%s) on the listener. Shutting down.\n"</span><span style="color: #007700">,<br /> </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">());<br /><br /> if (</span><span style="color: #0000BB">$errno </span><span style="color: #007700">!= </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">-></span><span style="color: #0000BB">exit</span><span style="color: #007700">(</span><span style="color: #0000BB">NULL</span><span style="color: #007700">);<br /> exit();<br /> }<br /> }<br /><br /> 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">) {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">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">);<br /> unset(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">connections</span><span style="color: #007700">[</span><span style="color: #0000BB">$id</span><span style="color: #007700">]);<br /> }<br /><br /> 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">) {<br /> 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">;<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">write</span><span style="color: #007700">(</span><span style="color: #0000BB">$string</span><span style="color: #007700">);<br /> }<br /><br /> 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">) {<br /> while(</span><span style="color: #0000BB">$buffer</span><span style="color: #007700">-></span><span style="color: #0000BB">input</span><span style="color: #007700">-></span><span style="color: #0000BB">length </span><span style="color: #007700">> </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></span><span style="color: #0000BB">input</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">-></span><span style="color: #0000BB">maxRead</span><span style="color: #007700">);<br /> </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">-></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">]);<br /><br /> if(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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"<br /> </span><span style="color: #007700">&& </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">)<br /> {<br /> </span><span style="color: #FF8000">// remove the trailing \r\n<br /> </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">-></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">,<br /> </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">);<br /><br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">;<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">);<br /> }<br /> }<br /> }<br /><br /> 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">) {<br /> switch (</span><span style="color: #0000BB">$line</span><span style="color: #007700">) {<br /> 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">):<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">);<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">);<br /> break;<br /><br /> 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">):<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">);<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">);<br /> break;<br /><br /> 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">):<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">);<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">ev_close</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">);<br /> break;<br /><br /> 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">):<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">);<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></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">sslFilter</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">base</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></span><span style="color: #0000BB">ctx</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">SSL_ACCEPTING</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">EventBufferEvent</span><span style="color: #007700">::</span><span style="color: #0000BB">OPT_CLOSE_ON_FREE</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">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">);<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">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">);<br /> break;<br /><br /> default:<br /> echo </span><span style="color: #DD0000">'unknown command: '</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">;<br /> break;<br /> }<br /> }<br />}<br /><br />new </span><span style="color: #0000BB">Handler</span><span style="color: #007700">();</span> </span> </code></div> </div> </div> </div> <hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="event.resources.html">Resource Types</a></div> <div class="next" style="text-align: right; float: right;"><a href="event.flags.html">Event flags</a></div> <div class="up"><a href="book.event.html">Event</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>