跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

php的libev扩展_PHP教程

ev is a PECL extension providing inteface to libev library – high performance full-featured event loop written in C.

ABOUT LIBEV Libev is an event loop: you register interest in certain events (such as a file descriptor being readable or a timeout occurring), and it will manage these event sources and provide your program with events.

那么什么是libev呢,从网上摘录一段:libev 是高性能事件循环/事件模型的网络库,并且包含大量新特性。

它是继lievent和Event perl module之后的一套全新网络库。它追求的目标:速度更快,bug更少,特性更多,体积更小。 www.2cto.com它和libevent很像,按照作者的介绍,可以作为libevent的替代者,能够提供更高的性能。并不需要复杂的配置。

看起来和之前提到的libevent大有渊源,但是这个扩展的作者显然比较活跃,一周内提交了3个版本。

代码示例timer的使用php// 创建一个timer并于2秒后触发$w1 = new EvTimer(2, 0, function () {echo "2 seconds elapsed\n";});// 创建一个timer并于2秒后触发,每秒重复// 直到我们手工停止$w2 = new EvTimer(2, 1, function ($w) {echo "is called every second, is launched after 2 seconds\n";echo "iteration = ", Ev::iteration(), PHP_EOL;// Stop the watcher after 5 iterations Ev::iteration() == 5 and $w->stop();// Stop the watcher if further calls cause more than 10 iterations Ev::iteration() >= 10 and $w->stop();});// 创建一个已停止的timer,手工start才有效$w_stopped = EvTimer::createStopped(10, 5, function($w) {echo "Callback of a timer created as stopped\n";// Stop the watcher after 2 iterations Ev::iteration() >= 2 and $w->stop();});// Loop until Ev::stop() is called or all of watchers stop Ev::run();// Start and look if it works$w_stopped->start();echo "Run single iteration\n";Ev::run(Ev::RUN_ONCE);echo "Restart the second watcher and try to handle the same events, but don't block\n";$w2->again();Ev::run(Ev::RUN_NOWAIT);$w = new EvTimer(10, 0, function() {});echo "Running a blocking loop\n";Ev::run();echo "END\n";?>输出内容2 seconds elapsed is called every second, is launched after 2 seconds iteration = 1 is called every second, is launched after 2 seconds iteration = 2 is called every second, is launched after 2 seconds iteration = 3 is called every second, is launched after 2 seconds iteration = 4 is called every second, is launched after 2 seconds iteration = 5 Run single iteration Callback of a timer created as stopped Restart the second watcher and try to handle the same events, but don't block Running a blocking loop is called every second, is launched after 2 seconds iteration = 8 is called every second, is launched after 2 seconds iteration = 9 is called every second, is launched after 2 seconds iteration = 10 END I/O事件例1 php

例2 php

error_reporting(E_ERROR);$e_nonblocking = array (/*EAGAIN or EWOULDBLOCK*/11, /*EINPROGRESS*/115);// Get the port for the WWW service$service_port = getservbyname('www', 'tcp');// Get the IP address for the target host$address = gethostbyname('google.co.uk');// Create a TCP/IP socket$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);if ($socket === FALSE) {echo "socket_create() failed: reason: ".socket_strerror(socket_last_error()) . "\n";}// Set O_NONBLOCK flag socket_set_nonblock($socket);// Abort on timeout$timeout_watcher = new EvTimer(10.0, 0., function () use ($socket) {socket_close($socket);Ev::stop(Ev::BREAK_ALL);});// Make HEAD request when the socket is writable$write_watcher = new EvIo($socket, Ev::WRITE, function ($w) use ($socket, $timeout_watcher, $e_nonblocking) {// Stop timeout watcher$timeout_watcher->stop();// Stop write watcher$w->stop();$in = "HEAD / HTTP/1.1\r\n";$in .= "Host: google.co.uk\r\n";$in .= "Connection: Close\r\n\r\n";if (!socket_write($socket, $in, strlen($in))) {trigger_error("Failed writing $in to socket", E_USER_ERROR);}$read_watcher = new EvIo($socket, Ev::READ, function ($w, $re) use ($socket, $e_nonblocking) {// Socket is readable. recv() 20 bytes using non-blocking mode$ret = socket_recv($socket, $out, 20, MSG_DONTWAIT);if ($ret) {echo $out;} elseif ($ret === 0) {// All read$w->stop();socket_close($socket);return;}// Caught EINPROGRESS, EAGAIN, or EWOULDBLOCK if (in_array(socket_last_error(), $e_nonblocking)) {return;}$w->stop();socket_close($socket);});Ev::run();});$result = socket_connect($socket, $address, $service_port);Ev::run();?>输出HTTP/1.1 301 Moved Permanently Location: http://www.google.co.uk/ Content-Type: text/html; charset=UTF-8 Date: Sun, 23 Dec 2012 16:08:27 GMT Expires: Tue, 22 Jan 2013 16:08:27 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 221 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN Connection: close http://www.bkjia.com/PHPjc/477830.html www.bkjia.com true http://www.bkjia.com/PHPjc/477830.html TechArticle ev is a PECL extension providing inteface to libev library high performance full-featured event loop written in C. ABOUT LIBEV Libev is an event loop: you register interest in certa...

相关文章