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 相关文章推荐
数字转英文
Dec 06 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
劣质的PHP代码简化
Feb 08 PHP
php将fileterms函数返回的结果变成可读的形式
Apr 21 PHP
浅析十款PHP开发框架的对比
Jul 05 PHP
PHP连接和操作MySQL数据库基础教程
Sep 29 PHP
php以post形式发送xml的方法
Nov 04 PHP
PHP调用MySQL存储过程并返回值的方法
Dec 26 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
Nov 30 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
Oct 14 PHP
laravel实现按时间日期进行分组统计方法示例
Mar 23 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 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
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
jQuery获取选中单选按钮radio的值
2016/12/27 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
Python matplotlib画曲线例题解析
2020/02/07 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
Python flask框架端口失效解决方案
2020/06/04 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
美国校园市场:OCM
2017/06/08 全球购物
运行时异常与一般异常有何异同?
2014/01/05 面试题
个人生活学习自我评价范文
2013/11/26 职场文书
2014年公司庆元旦活动方案
2014/03/05 职场文书
工伤赔偿协议书
2014/04/15 职场文书
给公司的建议书范文
2014/05/13 职场文书
525心理活动总结
2014/07/04 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
工作时间调整通知
2015/04/24 职场文书
SQL注入篇学习之盲注/宽字节注入
2022/03/03 MySQL
什么是css原子化,有什么用?
2022/04/24 HTML / CSS