1) struct event_config *event_config_new(void)
函数功能: 分配一个base 内部配置结构体
参数: 无
返回值:
成功返回指向struct event_config的指针
失败返回空
2) void event_config_free(struct event_config *cfg)
函数功能: 释放一个struct event_config结构体
参数:指向base内部配置的结构体的指针
返回值:无
3) int event_config_set_flag(struct event_config *cfg, int flag)
函数功能: 设置配置的标志位 为了后面的new base做准备
参数介绍:
cfg: 配置内部结构体用event_config_new()创建
flag: 配置的标记 会影响之后创建base时候的一些限制 取值为
EVENT_BASE_FLAG_NOLOCK //禁止对event_base 分配锁
EVENT_BASE_FLAG_IGNORE_ENV //禁止检查EVENT_*的环境变量 如"EVENT_PRECISE_TIMER"
EVENT_BASE_FLAG_NO_CACHE_TIME //base不缓存时间, 缓存时间是为了避免多次调用系统函数获得时间
EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST /*如果后台方法是epoll,则此模式是指可以安全的使用libevent内部 changelist 进行批量增删而尽可能减少系统调用,这种模式可以让代 码性能更高,但是可能会引起Linux bug 如果有任何由dup()或者他 的变量克隆的fds,则是不安全的,这样做会引起奇怪并且难以检查的 bug */
EVENT_BASE_FLAG_PRECISE_TIMER /*使用精度高的定时器 如CLOCK_MONOTONIC, 如果系统支持 timerfd_create() 则在epoll会使用此系统定时器
不设置的话默认使用CLOCK_MONOTONIC_COARSE(如果系统支持),了解 此宏,可以看clock_gettime()系统函数的使用*/
返回值:
成功返回 0,失败返回-1
4) int event_config_avoid_method(struct event_config *cfg, const char *method)
函数功能: 由于event base 支持多种io机制,如poll/epoll/select等,若我们不想让让event base选择哪个,那么我们就可以用此函数设 置禁止的io机制
要想禁止多个可以多次调用此函数,内部用链表保存禁止的项
参数:
cfg: 内部配置结构体指针
method: 禁止的io机制 取值为 "evport","kqueue","epoll","devpoll","poll","select"
返回值:
成功返回 0,失败返回-1
5) int event_config_require_features(struct event_config *cfg, int features)
函数功能: 设置配置的特性,event base会选择含有设置特性的io机制
对配置设置此特性 主要是为了筛选合适的io机制
对于各个io机制支持的 特性如下:
"evport":无
"kqueue": EV_FEATURE_ET|EV_FEATURE_O1|EV_FEATURE_FDS
"epoll": EV_FEATURE_ET|EV_FEATURE_O1|EV_FEATURE_EARLY_CLOSE
"devpoll": EV_FEATURE_FDS|EV_FEATURE_O1
"poll": EV_FEATURE_FDS
"select": EV_FEATURE_FDS
参数:
cfg: 内部配置结构体指针
features: 特性值 如下
EV_FEATURE_ET 边缘触发触发机制,高效但是容易丢消息,注意与水平触发区分
EV_FEATURE_O1 要求具有很多事件的io机制可以以近似O(1)处理事件,select和poll无法提供这种特征,它们只 能提供近似O(N)的操作
EV_FEATURE_FDS io机制可以处理包括sockets在内的各种文件描述符
EV_FEATURE_EARLY_CLOSE 检查事件连接是否关闭,可以使用此特性来检测链接是否关闭,而不需要读取此链接所有 未 决数据
返回值:
成功返回 0, 失败返回-1
6) int event_config_set_max_dispatch_interval(struct event_config *cfg,
const struct timeval *max_interval,
int max_callbacks,
int min_priority)
函数功能:
event base用一个数组根据优先级设置多个激活队列,值越小优先级越高
此函数用于设置处理某个优先级队列的时候的一些时间和处理回调个数的限制
参数:
cfg:内部配置结构体
max_interval: 某个激活队列处理的时间间隔,如果在某个优先级队列处理的时间超过了此值,则退出当前队列,处理下一个队列
max_callbacks: 某个激活队列中 处理的回调的个数,当某个队列处理的激活个数大于此值,则处理下一个队列
min_priority: 由于处理事件的时候根据优先级把激活的事件放到了不同的队列(一个数组实现的不同队列)
当数组下标小于此值的时候, 那么此下标对应的队列将不会被max_callbacks和max_interval所限制
当数组下标大于等于此值的时候,会受到max_callbacks和max_interval的限制
返回值:
永远返回 0,所以保证你传入的参数不要有问题,否则可能会出现无法预知的错误
1) struct event_config *event_config_new(void)函数功能: 分配一个base 内部配置结构体参数: 无返回值: 成功返回指向struct event_config的指针 失败返回空2) void event_config_free(struct event_config *cfg)函数功能: 释放一个struct event_...
LIBEVENT
:是一款事件驱动的网络开发包,由于采用C语言开发体积小巧,跨平台,速度极快.课程中讲解分析
LIBEVENT
原理,跨平台编译事件1O、缓冲O处理。讲解HTTP服务端开发示例,HTTP客户端请求开发示例,最后基于
LIBEVENT
T创建线程池C++框架,并用此框架完成FTP服务器的登录、目录访问、文件上传下载能功能。开发环境操作系统: windows1064位和 ubuntu18.0464位
Libevent
版本:2.1.8Windows开发工具:VS2017社区版ubuntu开发工具:g++make开发语言:C/C++课程亮点全称代码演示:课程中的每一行代码都会敲出来,并详解代码实际案例展示:基于
LIBEVENT
实现线程池和HTTP和TP服务器跨平台讲解:基于 WINDOWS、LNUX( UBUNTU18.04)平台开发移植
目录
libevent
接口分析事件
Event
处理
libevent
是一款事件驱动的网络开发包,由于采用c语言开发体积小巧,跨平台,速度极快。大量开源项目使用了
libevent
比如谷歌浏览器和分布式的高速缓存系统Memcached。ib
event
支持kqueue、select.poll epoll、iocp。内部事件机制完全独立于公开的事件APl,
Libevent
支持跨平台可以在Linux、*BSD、Mac OS x、Solaris、Windows等平台上编译。下载地址
libevent
.net
安装环境(环境有
event
_
config
_
new
配置文件配置项
event
_base_
config
_flag和
event
_
config
_set_flag
先看
event
_base_
config
_flag
按优先顺序排列的后端数组
static const struct
event
op *
event
ops[] = {
#ifdef
EVENT
__HAVE_
EVENT
_PORTS
&evportops,
#endif
#ifdef
EVENT
__HAVE_WORKING_KQUEUE
&kqops,
本文将重点
介绍
event
_base
相关
的几个接口
函数
,包括:
*
event
_base_
new
(),
event
_base_free(),
event
_base_loop(),
*
event
_base_
new
_with_
config
()
二.
函数
介绍
(1)
event
_base_
new
()
函数
该
函数
功能如字面意思,即建立一个新的
event
_bas...
如果你打开
Libevent
的一些文件,比如util.h文件。就会发现使用了很多宏定义,并根据一些宏定义而进行条件编译。这些宏定义往往来自
event
-
config
.h文件中。
如util.h文件的代码开始处:
event
_base_
new
(void)
struct
event
_base *base = NULL; // 初始化一个
event
_base
struct
event
_
config
*cfg =
event
_
config
_
new
(); // 看下文注解
if (cfg) {
base =
event
_base_
new
_with_
config
(cfg); // 将
event
_conf
构建
event
_base
在你开始使用任何
Libevent
前,你需要先创建一个或多个
event
_base。每个
event
_base管理着一个
event
的集合,并可以检测出哪些
event
被激活了。如果
event
_base使用了锁,就可以在多线程中安全的访问它。但要注意它的主poll
函数
只能被单个线程运行。如果你想用多个线程运行IO迭代器,你需要为每个线程分配一个
event
_base。
注:在以后
wget https://github.com/
libevent
/
libevent
/releases/download/release-2.1.11-stable/
libevent
-2.1.11-stable.tar.gz
tar -xzvf
libevent
-2.1.11-stable.tar.gz
cd
libevent
-2.1.11-stable
./
config
ure
make install
安装完成后,在 PHP 中使用
libevent
需要在 PHP.ini 中启用
event
扩展:
extension=
event
.so
然后你就可以在 PHP 中使用
libevent
了。
示例代码:
```php
$base =
new
Event
Base();
$
event
=
new
Event
($base, STDIN,
Event
::READ |
Event
::PERSIST, function($fd, $
event
s, $arg) {
static $max_requests = 0;
if (++$max_requests >= 10) {
Event
::del($arg);
return;
echo "stdin ready\n";
$
event
->add();
$base->loop();
上面的代码创建了一个基于事件的循环,并监听标准输入的可读事件。当标准输入可读时,会执行回调
函数
。
有关
libevent
的更多信息,你可以参考官方文档:http://php.net/manual/en/book.
event
.php