<!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>Creates new connection listener associated with an event base</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="class.eventlistener.html">EventListener</a></div> <div class="next" style="text-align: right; float: right;"><a href="eventlistener.disable.html">EventListener::disable</a></div> <div class="up"><a href="class.eventlistener.html">EventListener</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="eventlistener.construct" class="refentry"> <div class="refnamediv"> <h1 class="refname">EventListener::__construct</h1> <p class="verinfo">(PECL event >= 1.2.6-beta)</p><p class="refpurpose"><span class="refname">EventListener::__construct</span> — <span class="dc-title">Creates new connection listener associated with an event base</span></p> </div> <div class="refsect1 description" id="refsect1-eventlistener.construct-description"> <h3 class="title">Description</h3> <div class="methodsynopsis dc-description"> <span class="modifier">public</span> <span class="methodname"><strong>EventListener::__construct</strong></span> ( <span class="methodparam"> <span class="type"><a href="class.eventbase.html" class="type EventBase">EventBase</a></span> <code class="parameter">$base</code> </span> , <span class="methodparam"> <span class="type"><a href="language.types.callable.html" class="type callable">callable</a></span> <code class="parameter">$cb</code> </span> , <span class="methodparam"> <span class="type"><a href="language.pseudo-types.html#language.types.mixed" class="type mixed">mixed</a></span> <code class="parameter">$data</code> </span> , <span class="methodparam"> <span class="type">int</span> <code class="parameter">$flags</code> </span> , <span class="methodparam"> <span class="type">int</span> <code class="parameter">$backlog</code> </span> , <span class="methodparam"> <span class="type"><a href="language.pseudo-types.html#language.types.mixed" class="type mixed">mixed</a></span> <code class="parameter">$target</code> </span> )</div> <p class="para rdfs-comment"> Creates new connection listener associated with an event base. </p> </div> <div class="refsect1 parameters" id="refsect1-eventlistener.construct-parameters"> <h3 class="title">Parameters</h3> <dl> <dt> <span class="term"> <em><code class="parameter">base</code></em> </span> <dd> <p class="para"> Associated event base. </p> </dd> </dt> <dt> <span class="term"> <em><code class="parameter">cb</code></em> </span> <dd> <p class="para"> A <span class="type"><a href="language.types.callable.html" class="type callable">callable</a></span> that will be invoked when new connection received. </p> </dd> </dt> <dt> <span class="term"> <em><code class="parameter">data</code></em> </span> <dd> <p class="para"> Custom user data attached to <em><code class="parameter">cb</code></em> . </p> </dd> </dt> <dt> <span class="term"> <em><code class="parameter">flags</code></em> </span> <dd> <p class="para"> Bit mask of <em>EventListener::OPT_*</em> constants. See <a href="class.eventlistener.html#eventlistener.constants" class="link">EventListener constants</a> . </p> </dd> </dt> <dt> <span class="term"> <em><code class="parameter">backlog</code></em> </span> <dd> <p class="para"> Controls the maximum number of pending connections that the network stack should allow to wait in a not-yet-accepted state at any time; see documentation for your system’s <em>listen</em> function for more details. If <em><code class="parameter">backlog</code></em> is negative, Libevent tries to pick a good value for the <em><code class="parameter">backlog</code></em> ; if it is zero, Event assumes that <em>listen</em> is already called on the socket( <em><code class="parameter">target</code></em> ) </p> </dd> </dt> <dt> <span class="term"> <em><code class="parameter">target</code></em> </span> <dd> <p class="para"> May be string, socket resource, or a stream associated with a socket. In case if <em><code class="parameter">target</code></em> is a string, the string will be parsed as network address. It will be interpreted as a UNIX domain socket path, if prefixed with <em>'unix:'</em> , e.g. <em>'unix:/tmp/my.sock'</em> . </p> </dd> </dt> </dl> </div> <div class="refsect1 returnvalues" id="refsect1-eventlistener.construct-returnvalues"> <h3 class="title">Return Values</h3> <p class="para"> Returns <a href="class.eventlistener.html" class="classname">EventListener</a> object representing the event connection listener. </p> </div> <div class="refsect1 changelog" id="refsect1-eventlistener.construct-changelog"> <h3 class="title">Changelog</h3> <p class="para"> <table class="doctable informaltable"> <thead> <tr> <th>Version</th> <th>Description</th> </tr> </thead> <tbody class="tbody"> <tr> <td>1.5.0</td> <td> UNIX domain sockets' support added. </td> </tr> </tbody> </table> </p> </div> <div class="refsect1 examples" id="refsect1-eventlistener.construct-examples"> <h3 class="title">Examples</h3> <div class="example" id="example-4271"> <p><strong>Example #1 <span class="function"><strong>EventListener::__construct()</strong></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: #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> </div><hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="class.eventlistener.html">EventListener</a></div> <div class="next" style="text-align: right; float: right;"><a href="eventlistener.disable.html">EventListener::disable</a></div> <div class="up"><a href="class.eventlistener.html">EventListener</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>