主页 > PHP > 利用libevent来实现异步操作

利用libevent来实现异步操作

2013 年 04 月 16 日 没有评论

libevent是php的一个网络异步方面的拓展,利用他我们可以实现一些网络异步访问方面的工作。比如抓去远程网页的内容等,若是在从前,一个比较靠谱的办法是利用curl_multi_exec或者其他函数来串行的请求好几个接口,但是这个办法需要用一个do … while循环来完成请求,很是坑爹,必须等待上一次执行完了才会执行下一次的操作,那么要是用libevent呢,可不是酱紫的哦。下面直接晒代码:

<?php
function httpGet($host, $base) {

    global $index;
	
	//使用fsockopen会导致阻塞
    //$fd = fsockopen($host, 80, $errno, $errstr, 3);
    $fd = stream_socket_client("{$host}:80", $errno, $errstr, 3, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT); 
    $index[$fd] = 0;
	$event = event_new();
	//设置一个事件
	//回调函数有两个默认参数,第三个为传递值
    event_set($event, $fd, EV_WRITE | EV_PERSIST, function($fd, $events, $arg) use($host) {

		global $times, $limit, $index;
		
		if (!$index[$fd]) {
            $index[$fd] = 1;
            $out = "GET / HTTP/1.1\r\n";
            $out .= "Host: $host\r\n";
            $out .= "Connection: Close\r\n\r\n";
            fwrite($fd, $out);
        } else {
			//这里没有显示全部内容,这里获取的内容按照自己的需要去处理
            echo substr(fread($fd, 4096), 0, 20);
            if(feof($fd)) {
                fclose($fd);
                $times++;
                echo "done\n";
				//如果执行到最后一个事件了那么执行完毕退出
                if($times == $limit) {
                    event_base_loopexit($arg[1]);
                }
            }
		}
    }, array($event, $base));
    event_base_set($event, $base);
	//添加事件
    event_add($event);
}

$times = 0;
$limit = 2;
$index = array();

$base = event_base_new();

$urls = array('http://www.baidu.com', 'http://www.fbbin.com');

for($i = 0; $i < $limit; $i++) {
    echo "$i\n";
    httpGet($urls[$i], $base);
}

event_base_loop($base);

?>

代码中的 httpGet($urls[$i], $base);这行虽然是靠一个命令行顺序执行,但是不会阻塞后面的代码,直接就进行下一次请求了。在你运行的结果中你应该是先看到输出$i的值完了之后才会输出获取到的网页内容的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>