PHP高性能I/O框架Libevent的使用详解

上传人:m**** 文档编号:61316010 上传时间:2018-11-28 格式:DOCX 页数:10 大小:41.72KB
返回 下载 相关 举报
PHP高性能I/O框架Libevent的使用详解_第1页
第1页 / 共10页
PHP高性能I/O框架Libevent的使用详解_第2页
第2页 / 共10页
PHP高性能I/O框架Libevent的使用详解_第3页
第3页 / 共10页
PHP高性能I/O框架Libevent的使用详解_第4页
第4页 / 共10页
PHP高性能I/O框架Libevent的使用详解_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《PHP高性能I/O框架Libevent的使用详解》由会员分享,可在线阅读,更多相关《PHP高性能I/O框架Libevent的使用详解(10页珍藏版)》请在金锄头文库上搜索。

1、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 扩展提供了面向对象

2、的接口,且支持更多特性。libevent扩展系统需要先安装 Libevent 库:?1yum install libevent-dev然后安装PHP扩展。PHP5安装:?1pecl install libevent-0.1.0PHP7安装(不稳定):?12345git clone https:/ pecl-event-libeventphpize./configuremake & sudo make install注:后面的代码示例均使用的php5.6+libevent-0.1.0环境。基本使用下面的例子实现了一个单进程的TCP server,基于libevent实现I/O复用,达到高性能。l

3、ibevent_tcp_server.php?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115!-php $receive = ;$master = ;$buffers =

4、;$socket = stream_socket_server (tcp:/0.0.0.0:9201, $errno, $errstr);if (false = $socket ) echo $errstr($errno)n;exit();if (!$socket) die($errstr.-.$errno);stream_set_blocking($socket,0);$id = (int)$socket;$master$id = $socket;echo waiting client.n;/accept事件回调函数,参数分别是$fd, $events, $arg。/也就是 event_se

5、t 函数的$fd, $events, $arg参数。function ev_accept($socket, $flag, $base)global $receive;global $master;global $buffers;$connection = stream_socket_accept($socket);stream_set_blocking($connection, 0);$id = (int)$connection;echo new Client $idn;$event = event_new();event_set($event, $connection, EV_READ |

6、EV_PERSIST, ev_read, $id);event_base_set($event, $base);event_add($event);$master$id = $connection; $receive$id = ; $buffers$id = $event; / event实例一定要存放在一个全局数组里面。如果去掉该行,客户端强制断开再连接,服务端无法正常收到消息/read事件回调函数function ev_read($buffer, $flag, $id)global $receive;global $master;global $buffers;/该方法里的$buffer和

7、$master$id指向相同的内容/ var_dump(func_get_args(), $master$id );/循环读取并解析客户端消息while( 1 ) $read = fread($buffer, 1024);/客户端异常断开if($read = | $read = false)break;$pos = strpos($read, n);if($pos = false)$receive$id .= $read;/ echo received:.$read.;not all package,continue recpeingn;else$receive$id .= trim(subs

8、tr ($read,0,$pos+1);$read = substr($read,$pos+1);switch ( $receive$id )case quit:echo client close connn;/ fclose($master$id); /断开客户端连接/ event_del($buffers$id); /删除事件/下面的写法与上面调用函数效果一样,都是关闭客户端连接unset($master$id);unset($buffers$id);break;default:/ echo all package:n;echo $receive$id.n;break;$receive$i

9、d=;/创建全局event base$base = event_base_new();/创建 event$event = event_new(); /设置 event:其中$events设置为EV_READ | EV_PERSIST ;回调事件为ev_accept,参数 $base/EV_PERSIST可以让注册的事件在执行完后不被删除,直到调用event_del()删除.event_set($event, $socket, EV_READ | EV_PERSIST, ev_accept, $base); / 全局event base添加 当前eventevent_base_set($even

10、t, $base);event_add($event);echo start run.n;/进入事件循环event_base_loop($base);/下面这句不会被执行echo This code will not be executed.n;我们先运行代码:?123$ php libevent_tcp_server.phpwaiting client.start run.客户端使用telnet:?12345$ telnet 127.0.0.1 9201Trying 127.0.0.1.Connected to 127.0.0.1.Escape character is .hello ser

11、ver!代码里面我加了很多注释,基本上能看明白。需要注意的是:1、event_base是全局的,只需要创建一次,后续都是event的设置和添加。2、event_set的回调函数有三个参数,分别是$fd,$events,$arg。也就是 event_set 函数的$fd,$events,$arg参数。arg 如果需要多个,可以为数组。fd参数实际是保存的客户端连接,是个resource。events参数支持下列这些常量:EV_TIMEOUT: 超时。利用事件可以实现定时器EV_READ: 只要网络缓冲中还有数据,回调函数就会被触发EV_WRITE: 只要塞给网络缓冲的数据被写完,回调函数就会被触

12、发EV_SIGNAL: POSIX信号量EV_PERSIST: 不指定这个属性的话,回调函数被触发后事件会被删除EV_ET: Edge-Trigger边缘触发使用event_bufferlibevent还提供了event_buffer_系列函数。手册里的解释是:Libevent在基础的API里提供了一层抽象层,使用 buffered event ,我们无序手动处理I/O。估计是对性能的提升。乐淘棋牌http:/示例:libevent_buffer_tcp_server.php?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114!-php $receive = ;$master = ;$buffers = ;$socket = stream_socket_server (tc

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > PHP资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号