事件--Event

2021-03-24

使用特定平台可用的最佳I/O通知机制有效地调度基于I/O,时间和信号的事件的扩展。这是libevent到PHP基础结构的端口。

安装

扩展需要安装libevent库,安装地址:http://libevent.org/
扩展地址:https://pecl.php.net/package/event

Event flags

读写

//指示一个事件,当提供的文件描述符(通常是流资源或套接字)可以读取时,该事件变为活动状态。
Event::READ

//当提供的文件描述符(通常是流资源或套接字)准备好写入时,该事件将变为活动状态。
Event::WRITE

信号

//用于实现信号检测
Event::SIGNAL

超时

//表示事件在超时后变为活动状态。Event::TIMEOUT 构造事件时,将忽略该 标志:添加事件时可以设置超时,也可以不设置超时 。$what 发生超时时,在回调函数的参数中设置它。
Event::TIMEOUT

其他

//如果基础事件基础后端支持边缘触发的事件,则事件应被边缘触发
Event::ET

//事件是持久性的
Event::PERSIST

事件持久性

默认情况下,每当挂起事件变为活动状态时,它在执行回调之前就变为未挂起状态。因此,要使事件再次挂起,可以 从回调函数内部对其再次调用 Event::add()。
如果在事件上设置了Event::PERSIST标志,则该事件为持久事件 。这意味着即使事件的回调被激活,该事件仍保持挂起状态。 可以调用Event::del()方法使其不挂起
每当事件的回调运行时,持久事件的超时都会重置。因此,如果一个事件带有标志Event::READ | Event::PERSIST并且超时为五秒,则该事件将变为活动状态

事件回调

事件回调匹配以下原型

callback(mixed $fd = null , int $what = ? , mixed $arg = null):void
    fd 与事件关联的文件描述符,流资源或套接字。对于信号事件 fd ,等于信号编号
    what 触发 的所有事件的位掩码
    arg 用户自定义数据

Event::timer()希望原型匹配

callback(mixed $arg = null):void
    arg 用户自定义数据。

Event::signal()希望原型匹配

callback(int $signum = ? , mixed $arg = null):void
    signum 触发信号的编号(例如 SIGTERM )。
    arg 用户自定义数据

Event类

表示文件描述符上的事件,并且事件准备就绪,可以从文件描述符中读取或写入文件描述符;准备好要读取或写入的文件描述符(仅适用于沿边沿触发的I / O);超时到期;发生信号;用户触发的事件
每个事件都与EventBase相关联 。但是,在添加事件之前 (通过 Event::add() )永远不会触发 事件。添加的事件将保持 挂起 状态,直到发生已注册的事件为止,从而将其变为 活动 状态。为了处理事件,用户可以注册一个回调,当事件变为活动状态时调用该回调。如果将event配置为 persistent ,则它将保持未决状态。如果它不是持久性的,则在其回调运行时它将不再挂起。 Event::del() 方法 删除 事件,从而使其成为未决事件。通过 Event::add() 方法可以再次添加。

创建对象

//构造Event对象
Event::__construct(EventBase $base , mixed $fd , int $what , callable $cb , mixed $arg = NULL)
	base 要关联的事件库
	fd 流资源,套接字资源或数字文件描述符。对于计时器事件,请通过 -1 。对于信号事件,请传递信号编号,例如 SIGHUP
	what 事件标志
	cb 事件回调
	arg 自定义数据。如果指定,它将在事件触发时传递给回调。

//构造计时器事件对象。这是创建计时器事件的直接方法
Event::timer(EventBase $base , callable $cb , mixed $arg = ?):Event
	base 要关联的事件库
	cb 事件回调
	arg 自定义数据。如果指定,它将在事件触发时传递给回调。

//构造信号事件对象。这是创建信号事件的直接方法
Event::signal(EventBase $base , int $signum , callable $cb , mixed $arg = ?):Event
	base 要关联的事件库
	signum 信号编号
	cb 事件回调
	arg 自定义数据。如果指定,它将在事件触发时传递给回调。

优先级

//设置事件优先级
Event::setPriority(int $priority):bool

处理事件

//将事件标记为待处理。非挂起的事件将永远不会发生,并且事件回调将永远不会被调用,如果 在一个已经挂起的事件上调用Event::add(),libevent将使其挂起,并使用给定的超时(如果指定)重新安排它。如果在这种情况下未指定超时,则 Event::add()无效
Event::add(float $timeout = ?):bool
Event::addSignal(float $timeout = ?):bool
Event::addTimer(float $timeout = ?):bool
	timeout 超时(以秒为单位)

//从受监视的事件集中删除一个事件,即使其变为未决状态
Event::del():bool
Event::delSignal():bool
Event::delTimer():bool

//从libevent监视的事件列表中除去事件,并释放为该事件分配的资源
Event::free():void

//重新配置事件。此函数不会调用过时的libevent的event_set。它改为调用event_assign
Event::set(EventBase $base , mixed $fd , int $what = ? , callable $cb = ? , mixed $arg = ?):bool
	base 要关联的事件库
	fd 流资源,套接字资源或数字文件描述符。对于计时器事件,请通过 -1 。对于信号事件,请传递信号编号,例如 SIGHUP
	what 事件标志
	cb 事件回调
	arg 自定义数据。如果指定,它将在事件触发时传递给回调。

//重新配置计时器事件
Event::setTimer(EventBase $base , callable $cb , mixed $arg = ?):bool
	base 要关联的事件库
	cb 事件回调
	arg 自定义数据。如果指定,它将在事件触发时传递给回调。

验证

//检测事件是未决还是已计划
Event::pending(int $flags):bool
	flags 一个或以下常量的组合物
		Event::READ , Event::WRITE , Event::TIMEOUT , Event::SIGNAL

扩展信息

//返回具有此版本Libevent支持的方法名称的数组
Event::getSupportedMethods():array

EventBase类

表示libevent的事件库结构。它包含一组事件,并可进行轮询以确定哪些事件处于活动状态,每个事件库都有一个方法或后端,用于确定哪些事件已经准备好。可识别的方法有:select、poll、epoll、kqueue、devpoll、evport和win32。

创建对象

//构造EventBase对象
EventBase::__construct(EventConfig $cfg = ?)

事件状态

//等待事件变为活动状态,然后运行其回调
EventBase::dispatch():void

//等待事件变为活动状态,然后运行其回调
EventBase::loop(int $flags = ?):bool

调度

//告诉事件在给定的秒数后停止
EventBase::exit(float $timeout = ?):bool

//重新初始化事件库。然后调用
EventBase::reInit():bool

//告诉event_base停止调度事件
EventBase::stop():bool

验证

//检查是否告知事件循环退出
EventBase::gotExit():bool

//检查事件循环是否被告知退出
EventBase::gotStop():bool

优先级

//设置每个事件库的优先级数量
EventBase::priorityInit(int $n_priorities):bool

释放资源

//释放libevent为EventBase对象分配的资源
EventBase::free():void

其他

//返回所支持功能的位掩码
EventBase::getFeatures():int

//返回正在使用的事件方法
EventBase::getMethod():string

//成功时返回当前时间,如果可能,在基中查找缓存的值, 如果 没有缓存的时间,则调用gettimeofday()或clock_gettime()适当地调用 。
EventBase::getTimeOfDayCached():float

EventHttp类

代表HTTP服务器

创建对象

//构造EventHttp对象(HTTP服务器)
EventHttp::__construct(EventBase $base , EventSslContext $ctx = null)
	base 关联的事件库
	ctx EventSslContext 类对象。将普通的HTTP服务器转换为HTTPS服务器

绑定

//在指定的地址和端口上绑定HTTP服务器,可以多次调用以将同一HTTP服务器绑定到多个不同的端口
EventHttp::bind(string $address , int $port):void

回调

//为指定的URI设置回调
EventHttp::setCallback(string $path , string $cb , string $arg = ?):void
	path 调用回调的路径
	cb 回调 callback(EventHttpRequest $req = NULL , mixed $arg = NULL):void
	arg 用户自定义数据传递给回调

//设置默认回调以处理未被特定回调捕获的请求
EventHttp::setDefaultCallback(string $cb , string $arg = ?):void
	cb 回调 callback(EventHttpRequest $req = NULL , mixed $arg = NULL):void
	arg 用户自定义数据传递给回调

设置参数

//使HTTP服务器接受指定套接字流或资源上的连接
EventHttp::accept(mixed $socket):bool
	socket 表示准备好接受连接的套接字的套接字资源,流或数字文件描述符

//设置此服务器接受并传递给用户回调的请求中支持哪些HTTP方法
EventHttp::setAllowedMethods(int $methods):void
	methods 常量 的位掩码

//设置最大请求正文大小(以字节为单位)
EventHttp::setMaxBodySize(int $value):void

//设置最大HTTP标头大小(以字节为单位)
EventHttp::setMaxHeadersSize(int $value):void

//设置HTTP请求的超时时间(以秒为单位)
EventHttp::setTimeout(int $value):void

其它

//将服务器别名添加到HTTP服务器对象
EventHttp::addServerAlias(string $alias):bool

//删除服务器别名
EventHttp::removeServerAlias(string $alias):bool

EventHttpConnection类

表示一个HTTP连接

创建对象

//构造EventHttpConnection对象
EventHttpConnection::__construct(EventBase $base , EventDnsBase $dns_base , string $address , int $port , EventSslContext $ctx = null)
	base 关联的事件库。
	dns_base 如果 dns_base 为null,则主机名解析将被阻止。
	address 要连接的地址。
	port 要连接的端口。
	ctx EventSslContext 类对象。启用OpenSS

发送请求

//通过指定的连接发出HTTP请求	
EventHttpConnection::makeRequest(EventHttpRequest $req , int $type , string $uri):bool
	req 通过其发送请求的连接对象。
	type EventHttpRequest::CMD_*常数
	uri 与请求关联的URI

设置请求

//设置关闭连接的回调
EventHttpConnection::setCloseCallback(callable $callback , mixed $data = ?):void
	callback(EventHttpConnection $conn = null , mixed $arg = null):void

//设置连接的重试限制
EventHttpConnection::setRetries(int $retries):void
	retries 重试限制。 -1 表示无穷大。

//设置连接超时(以秒为单位)
EventHttpConnection::setTimeout(int $timeout):void

EventHttpRequest类

表示一个HTTP请求

常量

方法

//GET方法
EventHttpRequest::CMD_GET

//POST方法
EventHttpRequest::CMD_POST

//HEAD方法
EventHttpRequest::CMD_HEAD

//PUT方法
EventHttpRequest::CMD_PUT

//DELETE命令
EventHttpRequest::CMD_DELETE

//选项方法
EventHttpRequest::CMD_OPTIONS

//TRACE方法
EventHttpRequest::CMD_TRACE

//CONNECT方法
EventHttpRequest::CMD_CONNECT

//PATCH方法
EventHttpRequest::CMD_PATCH

请求头

//请求输入标头类型。
EventHttpRequest::INPUT_HEADER

//请求输出标头类型。
EventHttpRequest::OUTPUT_HEADER

对象方法

创建对象

//构造EventHttpRequest对象
EventHttpRequest::__construct(callable $callback , mixed $data = null)
	callback(EventHttpRequest $req = null , mixed $arg = null):void
	data 用户自定义数据传递给回调

请求

//关闭与请求关联的HTTP连接
EventHttpRequest::closeConnection():void

//取消正在进行的HTTP请求。不执行与此请求关联的回调,并且释放请求对象。如果请求当前正在处理中(例如正在处理中),则将 重置相应的EventHttpConnection对象。
EventHttpRequest::cancel():void

请求头

//将HTTP标头添加到请求的标头中
EventHttpRequest::addHeader(string $key , string $value , int $type):bool
	key 标头名称。
	value 标头值
	type EventHttpRequest::*_HEADER常量

//从请求的标头中删除HTTP标头
EventHttpRequest::removeHeader(string $key , string $type):void
	key 标头名称
	type  EventHttpRequest::*_HEADER常量

响应头

//从请求的标头列表中删除所有输出标头
EventHttpRequest::clearHeaders():void

数据块

//启动分块答复,发起使用Transfer-Encoding chunked的回复,允许调用方将答复流式传输回客户端,并且在不是所有答复数据都立即可用或发送非常大的答复时很有用
EventHttpRequest::sendReplyStart(int $code , string $reason):void
	code 要发送的HTTP响应代码。
	reason 与响应代码一起发送的简短消息

//发送另一个数据块作为正在进行的分块答复的一部分。调用此方法后buf将为空
EventHttpRequest::sendReplyChunk(EventBuffer $buf):void
	buf 作为答复的一部分发送的数据块

//完成分块答复,并根据需要释放请求
EventHttpRequest::sendReplyEnd():void

返回EventHttpConnection对象

//返回EventHttpConnection对象
EventHttpRequest::getConnection():EventHttpConnection

EventListener类

表示连接侦听器

预定义常量

//Libevent将基础文件描述符或套接字转换为非阻塞模式。该标志告诉Libevent将其置于阻止模式。
EventListener::OPT_LEAVE_SOCKETS_BLOCKING

//释放EventListener对象时,连接侦听器将关闭其基础套接字
EventListener::OPT_CLOSE_ON_FREE

//连接侦听器将在基础侦听器套接字上设置close-on-exec标志。
EventListener::OPT_CLOSE_ON_EXEC

//默认情况下,一旦关闭侦听器套接字,则经过一段时间后,其他套接字才能绑定到同一端口。设置此选项会使Libevent将套接字标记为可重用,以便一旦关闭套接字,便可以打开另一个套接字以侦听同一端口。
EventListener::OPT_REUSEABLE

//为侦听器分配锁,这样可以安全地从多个线程使用它
EventListener::OPT_THREADSAFE

对象方法

创建对象

//创建与事件库关联的新连接侦听器
EventListener::__construct(EventBase $base , callable $cb , mixed $data , int $flags , int $backlog , mixed $target)
	base 关联的事件库
	cb 回调
	data 附加到cb的自定义用户数据
	flags EventListener::OPT_* 常量的 位掩码
	backlog 控制网络堆栈在任何时候都可以在尚未接受的状态下等待的最大未决连接数;如果 backlog 为负,则Libevent尝试为选取一个好的值 backlog ;如果为零,则Event假定 listen 已在socket(target ) 上调用了该方法。
	target 可以是字符串,套接字资源或与套接字关联的流。如果 target 是字符串,该字符串将被解析为网络地址。如果以开头'unix:' , 则将其解释为UNIX域套接字路径 'unix:/tmp/my.sock'

设置回调

//调整事件连接侦听器的回调以及可选的callback参数
EventListener::setCallback(callable $cb , mixed $arg = null):void
	cb 新连接的新回调 callback(EventListener $listener = null , mixed $fd = null , array $address = null , mixed $arg = null):void
		listener 事件监听对象
		fd 与侦听器关联的文件描述符或资源
		address 两个元素组成的数组:IP地址和 服务器 端口
		arg 附加到回调的用户自定义数据
	arg 附加到回调的自定义用户数据

//设置事件侦听器的错误回调
EventListener::setErrorCallback(string $cb):void
	cb 错误回调 callback(EventListener $listener = null , mixed $data = null):void
		listener 事件监听对象
		data 附加到回调的用户自定义数据

侦听器

//启用事件连接侦听器对象
EventListener::enable():bool

//禁用事件连接侦听器对象
EventListener::disable():bool

//返回与事件侦听器关联的事件库
EventListener::getBase():void

//获取侦听器的套接字绑定到的当前地址
EventListener::getSocketName(string &$address , mixed &$port = ?):bool

EventSslContext类

表示SSL_CTX 结构。提供配置SSL上下文的方法和属性

//创建指向的SSL上下文保存指针 SSL_CTX 
EventSslContext::__construct(string $method , string $options)
	method EventSslContext::*_METHOD常数
		EventSslContext::SSLv2_CLIENT_METHOD SSLv2客户端方法
		EventSslContext::SSLv3_CLIENT_METHOD SSLv3客户端方法
		EventSslContext::SSLv23_CLIENT_METHOD SSLv23客户端方法
		EventSslContext::TLS_CLIENT_METHOD TLS客户端方法
		EventSslContext::SSLv2_SERVER_METHOD SSLv2服务器方法
		EventSslContext::SSLv3_SERVER_METHOD SSLv3服务器方法
		EventSslContext::SSLv23_SERVER_METHOD SSLv23服务器方法
		EventSslContext::TLS_SERVER_METHOD TLS服务器方法
	options EventSslContext::OPT_*常数
		EventSslContext::OPT_LOCAL_CERT 指向本地证书的路径
		EventSslContext::OPT_LOCAL_PK 指向私钥的路径
		EventSslContext::OPT_PASSPHRASE 证书的密码短语
		EventSslContext::OPT_CA_FILE 证书颁发机构文件的路径
		EventSslContext::OPT_CA_PATH 应在其中搜索证书颁发机构文件的路径
		EventSslContext::OPT_ALLOW_SELF_SIGNED 允许自签名证书的选项
		EventSslContext::OPT_VERIFY_PEER 诉Event验证对等项的选项
		EventSslContext::OPT_VERIFY_DEPTH SSL上下文应允许的证书链验证的最大深度。
		EventSslContext::OPT_CIPHERS SSL上下文的密码列表

 

{/if}