提供了一些类似nodejs异步调用的方式,
用途很多,如文件状态监视,流阻塞等待异步
pecl库的,默认不安装,需要自己在pecl下弄个过来
php manual地址:http://www.php.net/manual/zh/ev.examples.php
如果不知道libev是啥可以看这个http://dirlt.com/libev.html
这里罗列下具体手册内的代码,只翻译了关键注释
刚才由于对代码没有整理,竟然被过滤掉了……不能发html pre代码的博客编辑器好凄惨</p>
<span STYLE="color: #000000"><span STYLE="color: #FF8000">//创建一个定时器,2秒后启动,不循环只执行一次<br /></span><span STYLE="color: #0000BB">$w1 </span><span STYLE="color: #007700">= new </span><span STYLE="color: #0000BB">EvTimer</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">2</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">0</span><span STYLE="color: #007700">, function () {<br /> echo </span><span STYLE="color: #DD0000">"2 seconds elapsed\n"</span><span STYLE="color: #007700">;<br />});</p>
<p></span><span STYLE="color: #FF8000">//创建一个定时器,2秒后启动,1秒执行一次<br />// 直到碰到指定代码停止<br /></span><span STYLE="color: #0000BB">$w2 </span><span STYLE="color: #007700">= new </span><span STYLE="color: #0000BB">EvTimer</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">2</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">1</span><span STYLE="color: #007700">, function (</span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">) {<br /> echo </span><span STYLE="color: #DD0000">"is called every second, is launched after 2 seconds\n"</span><span STYLE="color: #007700">;<br /> echo </span><span STYLE="color: #DD0000">"iteration = "</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">iteration</span><span STYLE="color: #007700">(), </span><span STYLE="color: #0000BB">PHP_EOL</span><span STYLE="color: #007700">;</p>
<p> </span><span STYLE="color: #FF8000">//执行第五次停止<br /> </span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">iteration</span><span STYLE="color: #007700">() == </span><span STYLE="color: #0000BB">5 </span><span STYLE="color: #007700">and </span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">stop</span><span STYLE="color: #007700">();<br /> </span><span STYLE="color: #FF8000">// Stop the watcher if further calls cause more than 10 iterations<br /> </span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">iteration</span><span STYLE="color: #007700">() >= </span><span STYLE="color: #0000BB">10 </span><span STYLE="color: #007700">and </span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">stop</span><span STYLE="color: #007700">();<br />});</p>
<p></span><span STYLE="color: #FF8000">//创建计时器,未激活,需要代码激活<br /></span><span STYLE="color: #0000BB">$w_stopped </span><span STYLE="color: #007700">= </span><span STYLE="color: #0000BB">EvTimer</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">createStopped</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">10</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">5</span><span STYLE="color: #007700">, function(</span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">) {<br /> echo </span><span STYLE="color: #DD0000">"Callback of a timer created as stopped\n"</span><span STYLE="color: #007700">;</p>
<p> </span><span STYLE="color: #FF8000">//事件产生两次后停止定时器<br /> </span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">iteration</span><span STYLE="color: #007700">() >= </span><span STYLE="color: #0000BB">2 </span><span STYLE="color: #007700">and </span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">stop</span><span STYLE="color: #007700">();<br />});</p>
<p></span><span STYLE="color: #FF8000">//循环直到所有都关闭<br /></span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">run</span><span STYLE="color: #007700">();</p>
<p></span><span STYLE="color: #FF8000">//启动并检查是否开始工作<br /></span><span STYLE="color: #0000BB">$w_stopped</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">start</span><span STYLE="color: #007700">();<br />echo </span><span STYLE="color: #DD0000">"Run single iteration\n"</span><span STYLE="color: #007700">;<br /></span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">run</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">RUN_ONCE</span><span STYLE="color: #007700">);</p>
<p>echo </span><span STYLE="color: #DD0000">"重启定时器,并尝试继续处理相同事件,但是这次是非阻塞的方式\n"</span><span STYLE="color: #007700">;<br /></span><span STYLE="color: #0000BB">$w2</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">again</span><span STYLE="color: #007700">();<br /></span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">run</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">RUN_NOWAIT</span><span STYLE="color: #007700">);</p>
<p></span><span STYLE="color: #0000BB">$w </span><span STYLE="color: #007700">= new </span><span STYLE="color: #0000BB">EvTimer</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">10</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">0</span><span STYLE="color: #007700">, function() {});<br />echo </span><span STYLE="color: #DD0000">"阻塞方式运行\n"</span><span STYLE="color: #007700">;<br /></span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">run</span><span STYLE="color: #007700">();<br />echo </span><span STYLE="color: #DD0000">"END\n"</span><span STYLE="color: #007700">;</span></span>
========================<span STYLE="color: #000000"><span STYLE="color: #FF8000">//等待一直到STDIN准备好并可读<br /></span><span STYLE="color: #0000BB">$w </span><span STYLE="color: #007700">= new </span><span STYLE="color: #0000BB">EvIo</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">STDIN</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">READ</span><span STYLE="color: #007700">, function (</span><span STYLE="color: #0000BB">$watcher</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$revents</span><span STYLE="color: #007700">) {<br /> echo </span><span STYLE="color: #DD0000">"STDIN is readable\n"</span><span STYLE="color: #007700">;<br />});</p>
<p></span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">run</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">RUN_ONCE</span><span STYLE="color: #007700">);</span></span>
========================
非阻塞<span STYLE="color: #000000"><span STYLE="color: #0000BB">$e_nonblocking </span><span STYLE="color: #007700">= array (</span><span STYLE="
color: #0000BB">11</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">115</span><span STYLE="color: #007700">);</p>
<p></span> <span STYLE="color: #FF8000">//获取www服务服务端口<br /></span><span STYLE="color: #0000BB">$service_port </span><span STYLE="color: #007700">= </span><span STYLE="color: #0000BB">getservbyname</span><span STYLE="color: #007700">(</span><span STYLE="color: #DD0000">'www'</span><span STYLE="color: #007700">, </span><span STYLE="color: #DD0000">'tcp'</span><span STYLE="color: #007700">);</p>
<p></span><span STYLE="color: #FF8000">//获取域名对应ip<br /></span><span STYLE="color: #0000BB">$address </span><span STYLE="color: #007700">= </span><span STYLE="color: #0000BB">gethostbyname</span><span STYLE="color: #007700">(</span><span STYLE="color: #DD0000">'google.co.uk'</span><span STYLE="color: #007700">);</p>
<p></span><span STYLE="color: #FF8000">//创建socket通讯<br /></span><span STYLE="color: #0000BB">$socket </span><span STYLE="color: #007700">= </span><span STYLE="color: #0000BB">socket_create</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">AF_INET</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">SOCK_STREAM</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">SOL_TCP</span><span STYLE="color: #007700">);<br />if (</span><span STYLE="color: #0000BB">$socket </span><span STYLE="color: #007700">=== </span><span STYLE="color: #0000BB">FALSE</span><span STYLE="color: #007700">) {<br /> echo </span><span STYLE="color: #DD0000">"socket_create() failed: reason: "<br /> </span><span STYLE="color: #007700">.</span><span STYLE="color: #0000BB">socket_strerror</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">socket_last_error</span><span STYLE="color: #007700">()) . </span><span STYLE="color: #DD0000">"\n"</span><span STYLE="color: #007700">;<br />}</p>
<p></span><span STYLE="color: #FF8000">//表示非阻塞方式<br /></span><span STYLE="color: #0000BB">socket_set_nonblock</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">);</p>
<p></span><span STYLE="color: #FF8000">//如果在使用中超时自动关闭,这里用了evtimer<br /></span><span STYLE="color: #0000BB">$timeout_watcher </span><span STYLE="color: #007700">= new </span><span STYLE="color: #0000BB">EvTimer</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">10.0</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">0.</span><span STYLE="color: #007700">, function () use (</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">) {<br /> </span><span STYLE="color: #0000BB">socket_close</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">);<br /> </span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">stop</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">BREAK_ALL</span><span STYLE="color: #007700">);<br />});</p>
<p></span><span STYLE="color: #FF8000">//当socket可用后,进行发送接收操作<br /></span><span STYLE="color: #0000BB">$write_watcher </span><span STYLE="color: #007700">= new </span><span STYLE="color: #0000BB">EvIo</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">WRITE</span><span STYLE="color: #007700">, function (</span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">)<br /> use (</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$timeout_watcher</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$e_nonblocking</span><span STYLE="color: #007700">)<br />{<br /> </span><span STYLE="color: #FF8000">//超时timer停用<br /> </span><span STYLE="color: #0000BB">$timeout_watcher</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">stop</span><span STYLE="color: #007700">();<br /> </span><span STYLE="color: #FF8000">//停用evio监视<br /> </span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">stop</span><span STYLE="color: #007700">();</p>
<p> </span><span STYLE="color: #0000BB">$in </span><span STYLE="color: #007700">= </span><span STYLE="color: #DD0000">"HEAD / HTTP/1.1\r\n"</span><span STYLE="color: #007700">;<br /> </span><span STYLE="color: #0000BB">$in </span><span STYLE="color: #007700">.= </span><span STYLE="color: #DD0000">"Host: google.co.uk\r\n"</span><span STYLE="color: #007700">;<br /> </span><span STYLE="color: #0000BB">$in </span><span STYLE="color: #007700">.= </span><span STYLE="color: #DD0000">"Connection: Close\r\n\r\n"</span><span STYLE="color: #007700">;</p>
<p> if (!</span><span STYLE="color: #0000BB">socket_write</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$in</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">strlen</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$in</span><span STYLE="color: #007700">))) {<br /> </span><span STYLE="color: #0000BB">trigger_error</span><span STYLE="color: #007700">(</span><span STYLE="color: #DD0000">"Failed writing </span><span STYLE="color: #0000BB">$in</span><span STYLE="color: #DD0000"> to socket"</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">E_USER_ERROR</span><span STYLE="color: #007700">);<br /> }</p>
<p> </span><span STYLE="color: #0000BB">$read_watcher </span><span STYLE="color: #007700">= new </span><span STYLE="color: #0000BB">EvIo</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">READ</span><span STYLE="color: #007700">, function (</span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$re</span><span STYLE="color: #007700">)<br /> use (</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$e_nonblocking</span><span STYLE="color: #007700">)<br /> {<br /> </span><span STYLE="color: #FF8000">//非阻塞情况下从socket读取20字节数据<br /> </span><span STYLE="color: #0000BB">$ret </span><span STYLE="color: #007700">= </span><span STYLE="color: #0000BB">socket_recv</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$out</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">20</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">MSG_DONTWAIT</span><span STYLE="color: #007700">);</p>
<p> if (</span><span STYLE="color: #0000BB">$ret</span><span STYLE="color: #007700">) {<br /> echo </span><span STYLE="color: #0000BB">$out</span><span STYLE="color: #007700">;<br /> } elseif (</span><span STYLE="color: #0000BB">$ret </span><span STYLE="color: #007700">=== </span><span STYLE="color: #0000BB">0</span><span STYLE="color: #007700">) {<br /> </span><span STYLE="color: #FF8000">//读取完毕<br /> </span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">stop</span><span STYLE="color: #007700">();<br /> </span><span STYLE="color: #0000BB">socket_close</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">);<br /> return;<br /> }<br /
><br /> </span><span STYLE="color: #FF8000">//socket通讯错误<br /> </span><span STYLE="color: #007700">if (</span><span STYLE="color: #0000BB">in_array</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">socket_last_error</span><span STYLE="color: #007700">(), </span><span STYLE="color: #0000BB">$e_nonblocking</span><span STYLE="color: #007700">)) {<br /> return;<br /> }</p>
<p> </span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">stop</span><span STYLE="color: #007700">();<br /> </span><span STYLE="color: #0000BB">socket_close</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">);<br /> });</p>
<p> </span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">run</span><span STYLE="color: #007700">();<br />});</p>
<p></span><span STYLE="color: #0000BB">$result </span><span STYLE="color: #007700">= </span><span STYLE="color: #0000BB">socket_connect</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$socket</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$address</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$service_port</span><span STYLE="color: #007700">);</p>
<p></span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">run</span><span STYLE="color: #007700">();</span></span>
===========================
信号处理,当收到控制信号时自动启动<span STYLE="color: #000000"><span STYLE="color: #0000BB">$w </span><span STYLE="color: #007700">= new </span><span STYLE="color: #0000BB">EvSignal</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">SIGTERM</span><span STYLE="color: #007700">, function (</span><span STYLE="color: #0000BB">$watcher</span><span STYLE="color: #007700">) {<br /> echo </span><span STYLE="color: #DD0000">"SIGTERM received\n"</span><span STYLE="color: #007700">;<br /> </span><span STYLE="color: #0000BB">$watcher</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">stop</span><span STYLE="color: #007700">();<br />});</p>
<p></span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">run</span><span STYLE="color: #007700">();</span></span>
===========================<span STYLE="color: #000000"><span STYLE="color: #FF8000">//指定文件修改监视当监视文件出现变化,则触发,每8秒检查一次<br /></span><span STYLE="color: #0000BB">$w </span><span STYLE="color: #007700">= new </span><span STYLE="color: #0000BB">EvStat</span><span STYLE="color: #007700">(</span><span STYLE="color: #DD0000">"/var/log/messages"</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">8</span><span STYLE="color: #007700">, function (</span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">) {<br /> echo </span><span STYLE="color: #DD0000">"/var/log/messages changed\n"</span><span STYLE="color: #007700">;</p>
<p> </span><span STYLE="color: #0000BB">$attr </span><span STYLE="color: #007700">= </span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">attr</span><span STYLE="color: #007700">();</p>
<p> if (</span><span STYLE="color: #0000BB">$attr</span><span STYLE="color: #007700">[</span><span STYLE="color: #DD0000">'nlink'</span><span STYLE="color: #007700">]) {<br /> </span><span STYLE="color: #0000BB">printf</span><span STYLE="color: #007700">(</span><span STYLE="color: #DD0000">"Current size: %ld\n"</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$attr</span><span STYLE="color: #007700">[</span><span STYLE="color: #DD0000">'size'</span><span STYLE="color: #007700">]);<br /> </span><span STYLE="color: #0000BB">printf</span><span STYLE="color: #007700">(</span><span STYLE="color: #DD0000">"Current atime: %ld\n"</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$attr</span><span STYLE="color: #007700">[</span><span STYLE="color: #DD0000">'atime'</span><span STYLE="color: #007700">]);<br /> </span><span STYLE="color: #0000BB">printf</span><span STYLE="color: #007700">(</span><span STYLE="color: #DD0000">"Current mtime: %ld\n"</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$attr</span><span STYLE="color: #007700">[</span><span STYLE="color: #DD0000">'mtime'</span><span STYLE="color: #007700">]);<br /> } else {<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">"`messages` file is not there!"</span><span STYLE="color: #007700">);<br /> </span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">stop</span><span STYLE="color: #007700">();<br /> }<br />});</p>
<p></span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">run</span><span STYLE="color: #007700">();</span></span>
============================
进程状态监视<span STYLE="color: #000000"><span STYLE="color: #0000BB">$pid </span><span STYLE="color: #007700">= </span><span STYLE="color: #0000BB">pcntl_fork</span><span STYLE="color: #007700">();</p>
<p>if (</span><span STYLE="color: #0000BB">$pid </span><span STYLE="color: #007700">== -</span><span STYLE="color: #0000BB">1</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">"pcntl_fork failed\n"</span><span STYLE="color: #007700">);<br />} elseif (</span><span STYLE="color: #0000BB">$pid</span><span STYLE="color: #007700">) {<br /> </span><span STYLE="color: #0000BB">$w </span><span STYLE="color: #007700">= new </span><span STYLE="color: #0000BB">EvChild</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$pid</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">FALSE</span><span STYLE="color: #007700">, function (</span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$revents</span><span STYLE="color: #007700">) {<br /> </span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">stop</span><span STYLE="color: #007700">();</p>
<p> </span><span STYLE="color: #0000BB">printf</span><span STYLE="color: #007700">(</span><span STYLE="color: #DD0000">"Process %d exited with status %d\n"</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">rpid</span><span STYLE="color: #007700">, </span><span STYLE="color: #0000BB">$w</span><span STYLE="color: #007700">-></span><span STYLE="color: #0000BB">rstatus</span><span STYLE="color: #007700">);<br /> });</p>
<p> </span><span STYLE="color: #0000BB">Ev</span><span STYLE="color: #007700">::</span><span STYLE="color: #0000BB">run</span><span STYLE="color: #007700">();</p>
<p> </span><span STYLE="color: #FF8000">// Protect against Zombies<br /> </span><span STYLE="color: #0000BB">pcntl_wait</span><span STYLE="color: #007700">(</span><span STYLE="color: #0000BB">$status</span><span STYLE="color: #007700">);<br />} else {<br /> </span><span STYLE="color: #FF8000">//Forked child<br /> </span><span STYLE="color: #007700">exit(</span><span STYLE="color: #0000BB">2</span><span STYLE="color: #007700">);<br />}</span></span>