PHP高性能I/O框架Libevent的使用详解Libevent是一个用C语言编写的、轻量级的开源高性能I/O框架,支持多种I/O多路 复用技术:epoll、poll、dev/poll、select和kqueue等;支持I/O,定时器和信号等事件;注 册事件优先级。PHP提供了对应的扩展libevent、Event。libevent扩展很久没有更新了,仅支持PHP5系列,PHP7 虽然有网友fork了libevent扩展的源码进行更新兼容,但是稳定性不好,可能会出现段错误,所以PHP7最好使用Event 扩展。与libevent扩展不同的是,Event扩展提供了面向对象的接口,且支持更多特性。libevent扩展系统需要先安装 Libevent库:?1yuminstalllibevent-dev然后安装PHP扩展。PHP5安装:?1peclinst alllibevent-0.1.0PHP7安装(不稳定):?12345gitclonehttps://github.com/ expressif/pecl-event-libevent.gitcdpecl-event-libeventphpize./co nfiguremake&&sudomakeinstall注:后面的代码示例均使用的php5.6+libevent-0.1. 0环境。基本使用下面的例子实现了一个单进程的TCPserver,基于libevent实现I/O复用,达到高性能。libevent _tcp_server.php?1234567891011121314151617181920212223242526272829 30313233343536373839404142434445464748495051525354555657585960616 26364656667686970717273747576777879808182838485868788899091929394 9596979899100101102103104105106107108109110111112113114115我们先运行代码:?123$phplibevent_tcp_ser ver.phpwaitingclient...startrun...客户端使用telnet:?12345$telnet12 7.0.0.19201Trying127.0.0.1...Connectedto127.0.0.1.Escapechar acteris''^]''.helloserver!代码里面我加了很多注释,基本上能看明白。需要注意的是:1、event_bas e是全局的,只需要创建一次,后续都是event的设置和添加。2、event_set的回调函数有三个参数,分别是$fd,$event s,$arg。也就是event_set函数的$fd,$events,$arg参数。arg如果需要多个,可以为数组。fd参数实 际是保存的客户端连接,是个resource。events参数支持下列这些常量:EV_TIMEOUT:超时。利用事件可以实现定时器 EV_READ:只要网络缓冲中还有数据,回调函数就会被触发EV_WRITE:只要塞给网络缓冲的数据被写完,回调函数就会被触发E V_SIGNAL:POSIX信号量EV_PERSIST:不指定这个属性的话,回调函数被触发后事件会被删除EV_ET:Edge -Trigger边缘触发使用event_bufferlibevent还提供了event_buffer_系列函数。手册里的解释是:L ibevent在基础的API里提供了一层抽象层,使用bufferedevent,我们无序手动处理I/O。估计是对性能的提升。 乐淘棋牌http://www.jiekeqipai.net示例:libevent_buffer_tcp_server.php?12 34567891011121314151617181920212223242526272829303132333435363738 39404142434445464748495051525354555657585960616263646566676869707 17273747576777879808182838485868788899091929394959697989910010110 2103104105106107108109110111112113114注释我 都写了,相比前一个例字,主要有3个地方不同:1、ev_accept里设置read事件全换成了待buffer的函数;2、ev_rea d回调接收参数为2个;3、ev_read回调里读取消息使用event_buffer_read,而不是fread。另外增加了ev_w rite,ev_error回调。638棋牌http://www.dadiqipaigw.cn定时器libevent提供了event _timer_系列函数,实现一次性定时器,精度微秒。libevent_timer.php?1234567891011121314 151617181920212223242526272829305){?event_timer_del($args[1]);//删除 定时器?}}?$base=event_base_new();$ev_timer=event_timer_new();eve nt_timer_set($ev_timer,''ev_timer'',[$TIME_INTVAL,$ev_timer]);ev ent_base_set($ev_timer,$base);event_timer_add($ev_timer,$TIME_I NTVAL);//单位微秒?event_base_loop($base);上面的例子实现了每1秒执行一次回调函数。乐淘棋牌http ://www.letaoqpyx.com使用event_系列函数也可以实现:libevent_timer2.php?123456 789101112131415161718192021222324252627285){?event_timer_del($args[1]);?}}?$base=event_base_new();$event=event_new();event_set($event,0,EV_TIMEOUT,''ev_timer'',[$TIME_INTVAL,$event]);event_base_set($event,$base);event_add($event,$TIME_INTVAL);?event_base_loop($base);可以看出,event_timer_系列函数是对event_系列函数EV_TIMEOUT事件的包装。总结event_系列函数基本上可以分为上面三大类。 |
|