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 相关文章推荐
PHP面向对象编程快速入门
Dec 14 PHP
PHP采集利器 Snoopy 试用心得
Jul 03 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
Nov 26 PHP
PHPMailer的主要功能特点和简单使用说明
Feb 17 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
php遍历数组的4种方法总结
Jul 05 PHP
PHP的Socket网络编程入门指引
Aug 11 PHP
php判断当前操作系统类型
Oct 28 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 PHP
laravel学习教程之存取器
Jul 30 PHP
Laravel 简单实现Ajax滚动加载示例
Oct 22 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
用PHP来写记数器(详细介绍)
2006/10/09 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
js中匿名函数的N种写法
2010/09/08 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
Express.JS使用详解
2014/07/17 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
JS实现分页导航效果
2020/02/19 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
2020/04/06 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
python实现神经网络感知器算法
2017/12/20 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
Python自动登录QQ的实现示例
2020/08/28 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
前台文员我鉴定
2014/01/12 职场文书
酒店员工培训方案
2014/06/02 职场文书
2014年班级工作总结
2014/11/14 职场文书
奖学金个人总结
2015/03/04 职场文书
工会文体活动总结
2015/05/07 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python