来自:mjsws > 馆藏分类
配色: 字号:
PHP高性能框架Libevent的使用详解
2018-11-28 | 阅:  转:  |  分享 
  
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_系列函数基本上可以分为上面三大类。
献花(0)
+1
(本文系mjsws首藏)