php libevent 功能与使用方法详解


Posted in PHP onMarch 04, 2020

本文实例讲述了php libevent 功能与使用方法。分享给大家供大家参考,具体如下:

libevent是一个基于事件驱动的高性能网络库。支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

常量如下:

常量名 含义
1 EV_TIMEOUT 超过时间后事件成为激活状态
2 EV_READ FD就绪,可以读取的时候 ,事件成为激活状态
4 EV_WRITE FD就绪,可以写入的时候 ,事件成为激活状态
8 EV_SIGNAL 用于实现信号检测
16 EV_PERSIST 表示事件是持久的
32 EV_ET 表示底层是否支持边沿触发事件
1 EVLOOP_ONCE 如果设置了EVLOOP_ONCE,循环将等待某些事件成为激活的,执行激活的事件直到没有更多的事件可以执行,然会返回。
2 EVLOOP_NONBLOCK 如果设置了EVLOOP_NONBLOCK,循环不会等待事件被触发:循环将仅仅检测是否有事件已经就绪,可以立即触发,如果有,则执行事件的回调。

函数如下:

event_base_free() 释放资源,这不能销毁绑定事件
event_base_loop() 处理事件,根据指定的base来处理事件循环
event_base_loopbreak() 立即取消事件循环,行为各break语句相同
event_base_loopexit() 在指定的时间后退出循环
event_base_new() 创建并且初始事件
event_base_priority_init() 设定事件的优先级
event_base_set() 关联事件到事件base
event_buffer_base_set() 关联缓存的事件到event_base
event_buffer_disable() 禁用一个缓存的事件
event_buffer_enable() 启用一个指定的缓存的事件
event_buffer_fd_set() 改变一个缓存的文件系统描述
event_buffer_free() 释放缓存事件
event_buffer_new() 建立一个新的缓存事件
event_buffer_priority_set() 缓存事件的优先级设定
event_buffer_read() 读取缓存事件中的数据
event_buffer_set_callback() 给缓存的事件设置或重置回调函数
event_buffer_timeout_set() 给一个缓存的事件设定超时的读写时间
event_buffer_watermark_set 设置读写事件的水印标记
event_buffer_write() 向缓存事件中写入数据
event_add() 向指定的设置中添加一个执行事件
event_del() 从设置的事件中移除事件
event_free() 清空事件句柄
event_new() 创建一个新的事件
event_set() 准备想要在event_add中添加事件

例1如下:

<?php
//创建和初始化新的事件库
$base = event_base_new();
//创建并返回一个新的事件资源
$event = event_new();
//准备一个事件
event_set($event, 0, EV_TIMEOUT, function() {
  echo "run...";
});
//关联事件到事件库
event_base_set($event, $base);
//添加事件
event_add($event, 5000000);
//根据指定的事件库来处理事件循环
event_base_loop($base);

上述代码在等待了5秒后打印出run...后程序结束。

我们把上述代码修改一下:

<?php
//创建和初始化新的事件库
$base = event_base_new();
//创建并返回一个新的事件资源
$event = event_new();
//准备一个事件
event_set($event, 0, EV_TIMEOUT | EV_PERSIST, function() {
  echo "run...\r\n";
});
//关联事件到事件库
event_base_set($event, $base);
//添加事件
event_add($event, 1000000);
//根据指定的事件库来处理事件循环
event_base_loop($base);

上述代码会每隔1秒钟打印出run...,只是因为我们在event_set时使用了EV_PERSIST,表示该事件是一个持久的。

例2如下:

<?php
function printContent($fd, $events, $args) {
  $data = trim(fgets($fd));
  echo "input: ", $data, "\r\n";
}
 
//创建和初始化新的事件库
$base = event_base_new();
//创建并返回一个新的事件资源
$event = event_new();
//这里把标准输入流传入到函数printContent中
$fd = STDIN;
event_set($event, $fd, EV_PERSIST | EV_TIMEOUT, 'printContent', array($event, $base));
//关联事件到事件库
event_base_set($event, $base);
//添加事件
event_add($event, 1000000);
//根据指定的事件库来处理事件循环
event_base_loop($base);

代码每隔1秒钟,会从标准输入中读取用户输入的内容,再打印出来。

例3如下:

<?php
//创建套接字
$socket = stream_socket_server('tcp://0.0.0.0:8888', $errno, $errstr);
//设置资源流为非阻塞模式
stream_set_blocking($socket, 0);
 
//创建和初始化新的事件库
$base = event_base_new();
//创建并返回一个新的事件资源
$event = event_new();
//准备一个事件
event_set($event, $socket, EV_PERSIST | EV_READ, 'accept', $base);
//关联事件到事件库
event_base_set($event, $base);
//添加事件
event_add($event);
//根据指定的事件库来处理事件循环
event_base_loop($base);
 
function accept($socket, $events, $base) {
  //获取客户端连接后的socket
  $client = stream_socket_accept($socket);
  //设置该socket为非阻塞模式
  stream_set_blocking($client, 0);
  //创建一个新的缓存事件
  $buffer = event_buffer_new($client, 'read', NULL, 'error', $client);
  //关联缓存事件到事件库
  event_buffer_base_set($buffer, $base);
  //缓存事件超时时间
  event_buffer_timeout_set($buffer, 30, 30);
  //设置缓存事件读写的水印标记
  event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff);
  //设置缓存事件的优先级
  event_buffer_priority_set($buffer, 10);
  //启用缓存事件
  event_buffer_enable($buffer, EV_READ | EV_PERSIST);
  //这里好像必需把$buffer赋给一个全局的变量
  $GLOBALS['_'] = $buffer;
}
 
function read($buffer, $client) {
  //从缓存事件中读取数据
  while ($read = event_buffer_read($buffer, 256)) {
  }
  //给连接的socket客户端写入数据
  fwrite($client, date('Y-m-d H:i:s'));
  error($buffer, '', $client);
}
 
function error($buffer, $error, $client) {
  //禁用一个缓存事件
  event_buffer_disable($buffer, EV_READ | EV_WRITE);
  //释放缓存事件
  event_buffer_free($buffer);
  //关闭客户端socket
  fclose($client);
}

附:linux 下 php 安装 libevent

一、安装libevent库

1、到libevent官网下载安装源码

http://libevent.org/

如:libevent-2.0.22-stable.tar.gz

2、解压源码包

> tar zxvf libevent-2.0.22-stable.tar.gz
> cd libevent-2.0.22-stable

3、configure

> ./configure --prefix=/usr/local/libevent

4、make && make install

> make
> make install

二、安装php的libevent扩展

1、下载地址如下:

http://pecl.php.net/package/libevent

如:libevent-0.1.0.tgz

2、解压

> tar zxvf libevent-0.1.0.tgz

3、通过phpize命令生成configure

> /data/nmp/php/bin/phpize

(*如上路径只作演示,具体视安装环境而定。)

4、生成好后,运行configure

> ./configure --with-php-config=/data/nmp/php/bin/php-config --with-libevent=/usr/local/libevent

5、make && make install

> make
> make install

6、修改php.ini文件,添加如下

extension=libevent.so

7、重启服务器

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
THINKPHP+JS实现缩放图片式截图的实现
Mar 07 PHP
php对mongodb的扩展(初出茅庐)
Nov 11 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
Sep 28 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
php相对当前文件include其它文件的方法
Mar 13 PHP
php将12小时制转换成24小时制的方法
Mar 31 PHP
PHP制作用户注册系统
Oct 23 PHP
php 自定义错误日志实例详解
Nov 12 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
Apr 23 PHP
php设计模式之策略模式应用案例详解
Jun 17 PHP
PHP命名空间与自动加载机制的基础介绍
Aug 25 PHP
php实现的数组转xml案例分析
Sep 28 PHP
php+iframe 实现上传文件功能示例
Mar 04 #PHP
php实现文件上传基本验证
Mar 04 #PHP
PHP实现文件上传操作和封装
Mar 04 #PHP
PHP实现文件上传后台处理脚本
Mar 04 #PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
Mar 03 #PHP
php+ajax实现文件切割上传功能示例
Mar 03 #PHP
php 输出缓冲 Output Control用法实例详解
Mar 03 #PHP
You might like
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
PHP删除HTMl标签的三种解决方法
2013/06/30 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
js showModalDialog参数的使用详解
2014/01/07 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
2014/02/07 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
微信小程序如何访问公众号文章
2019/07/08 Javascript
webpack3.0升级4.0的方法步骤
2020/04/02 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
Django框架模板介绍
2019/01/15 Python
Python中的集合介绍
2019/01/28 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
css3闪亮进度条效果实现思路及代码
2013/04/17 HTML / CSS
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
大专应届生个人简历的自我评价
2013/10/15 职场文书
服装采购员岗位职责
2014/03/15 职场文书
材料员岗位职责
2015/02/10 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python