PHP头条
热点:

php的libev扩展


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
// Wait until STDIN is readable
$w = new EvIo(STDIN, Ev::READ, function ($watcher, $revents) {
    echo "STDIN is readable\n";
});
Ev::run(Ev::RUN_ONCE);
?>
例2
 
<?php
/* Use some async I/O to access a socket */
 
// `sockets' extension still logs warnings
// for EINPROGRESS, EAGAIN/EWOULDBLOCK etc.
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

www.phpzy.comtrue/phprm/12731.htmlTechArticlephp的libev扩展 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 bein...

相关文章

    暂无相关文章
相关频道:

PHP之友评论

今天推荐