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地址: http://pecl.php.net/package/libevent

libevent文档: http://docs.php.net/libevent

系统需要先安装 Libevent 库:

然后安装PHP扩展。

PHP5安装:

PHP7安装(不稳定):

注:后面的代码示例均使用的 + 环境。

基本使用

下面的例子实现了一个单进程的TCP server,基于libevent实现I/O复用,达到高性能。

我们先运行代码:

客户端使用telnet:

代码里面我加了很多注释,基本上能看明白。需要注意的是:

1、 是全局的,只需要创建一次,后续都是event的设置和添加。

2、 的回调函数有三个参数,分别是 , , 。也就是 event_set 函数的 , , 参数。arg 如果需要多个,可以为数组。fd参数实际是保存的客户端连接,是个resource。events参数支持下列这些常量:

: 超时。利用事件可以实现定时器

: 只要网络缓冲中还有数据,回调函数就会被触发

: 只要塞给网络缓冲的数据被写完,回调函数就会被触发

: POSIX信号量

: 不指定这个属性的话,回调函数被触发后事件会被删除

: Edge-Trigger边缘触发

3、 回调里面,后面几行如果不设置,会出现异常。目前没有找到好的解释。

4、 回调里面,删除客户端连接使用 unset也可以达到同样效果,这个和第3点一样,没有找到好的解释。

使用event_buffer

libevent还提供了 系列函数。手册里的解释是:Libevent在基础的API里提供了一层抽象层,使用 buffered event ,我们无需手动处理I/O。估计是对性能的提升。

示例:

注释我都写了,相比前一个例字,主要有3个地方不同:

1、 里设置read事件全换成了待buffer的函数;

2、 回调接收参数为2个;

3、 回调里读取消息使用 ,而不是fread。另外增加了 , 回调。

定时器

libevent提供了 系列函数,实现一次性定时器,精度微秒。

上面的例子实现了每1秒执行一次回调函数。

使用 系列函数也可以实现:

可以看出, 系列函数是对 系列函数 事件的包装。

总结

系列函数基本上可以分为上面三大类。还有几个函数没有提到,大家看手册就能了解。

(未完待续)

推广时间

最近在GitChat开了一期 Chat ,主题是《PHP Socket 编程进阶指南》,主要和大家讲解 PHP Socket 编程相关知识。通过参与本场 Chat,您将学到如下内容:

熟悉 Socket 系列函数。

熟悉 stream_socket 系列函数。

如何使用 Socket 系列函数实现 TCP 服务端和客户端?

如何使用 socket_select 实现 I/O 多路复用?

如何使用 stream_socket 系列函数实现TCP服务端和客户端?

如何使用 stream_select 实现 I/O 多路复用?

欢迎感兴趣的朋友参加或者帮忙宣传!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180702G06ZIR00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券