Ev 类

(PECL ev >= 0.2.0)

介绍

Ev 是一个静态类,提供对默认循环和一些常见操作的访问。

类概要

final class Ev {
/* 常量 */
const int FLAG_AUTO = 0;
const int FLAG_NOENV = 16777216;
const int FLAG_FORKCHECK = 33554432;
const int FLAG_NOINOTIFY = 1048576;
const int FLAG_SIGNALFD = 2097152;
const int FLAG_NOSIGMASK = 4194304;
const int RUN_NOWAIT = 1;
const int RUN_ONCE = 2;
const int BREAK_CANCEL = 0;
const int BREAK_ONE = 1;
const int BREAK_ALL = 2;
const int MINPRI = -2;
const int MAXPRI = 2;
const int READ = 1;
const int WRITE = 2;
const int TIMER = 256;
const int PERIODIC = 512;
const int SIGNAL = 1024;
const int CHILD = 2048;
const int STAT = 4096;
const int IDLE = 8192;
const int PREPARE = 16384;
const int CHECK = 32768;
const int EMBED = 65536;
const int CUSTOM = 16777216;
const int ERROR = 2147483648;
const int BACKEND_SELECT = 1;
const int BACKEND_POLL = 2;
const int BACKEND_EPOLL = 4;
const int BACKEND_KQUEUE = 8;
const int BACKEND_DEVPOLL = 16;
const int BACKEND_PORT = 32;
const int BACKEND_ALL = 63;
const int BACKEND_MASK = 65535;
/* 方法 */
final public static backend(): int
final public static depth(): int
final public static embeddableBackends(): int
final public static feedSignal( int $signum ): void
final public static feedSignalEvent( int $signum ): void
final public static iteration(): int
final public static now(): float
final public static nowUpdate(): void
final public static recommendedBackends(): int
final public static resume(): void
final public static run( int $flags = ?): void
final public static sleep( float $seconds ): void
final public static stop( int $how = ?): void
final public static supportedBackends(): int
final public static suspend(): void
final public static time(): float
final public static verify(): void
}

预定义常量

传递给创建循环的标志

Ev::FLAG_AUTO

默认标志值

Ev::FLAG_NOENV

如果使用此标志(或程序以 setuid 或 setgid 运行),libev 不会查看环境变量 LIBEV_FLAGS。 否则(默认情况下),如果找到 LIBEV_FLAGS,它将完全覆盖标志。 对于性能测试和搜索错误很有用。

Ev::FLAG_FORKCHECK

使 libev 在每次迭代中检查是否分叉,而不是手动调用 EvLoop::fork()。 这是通过在循环的每次迭代中调用 getpid() 来实现的,因此这可能会减慢事件循环,因为循环迭代次数很多,但通常不会注意到。 此标志设置不能被覆盖或在 LIBEV_FLAGS 环境变量中指定。

Ev::FLAG_NOINOTIFY

当指定此标志时,libev 不会尝试使用 inotify API 来处理其 » ev_stat 监视器。 该标志可用于节省 inotify 文件描述符,因为否则每个使用 ev_stat 监视器的循环都会消耗一个 inotify 处理程序。

Ev::FLAG_SIGNALFD

当指定此标志时,libev 将尝试使用 signalfd API 来处理其 » ev_signal (以及 » ev_child)监视器。 此 API 同步传递信号,这使其更快,并且可以使获取排队的信号数据成为可能。 它还可以简化使用线程的信号处理,只要在线程中正确地阻塞信号。 默认情况下不会使用 Signalfd

Ev::FLAG_NOSIGMASK

当指定此标志时,libev 会避免修改信号掩码。 具体来说,这意味着必须确保在接收信号之前解除对信号的阻塞。

此行为对于自定义信号处理或仅在特定线程中处理信号很有用。

传递给 Ev::run()EvLoop::run() 的标志

Ev::RUN_NOWAIT

表示事件循环将查找新事件,处理这些事件和任何已发生的事件,但不会等待并阻塞进程,以防没有事件,并在循环执行一次后返回。 这有时用于在进行冗长的计算时轮询和处理新事件,以保持程序的响应能力。

Ev::RUN_ONCE

表示事件循环将查找新事件(如果需要,等待)并处理这些事件以及任何已发生的事件。 它将阻塞进程,直到至少到达一个新事件(这可能是 libev 本身内部的事件,因此不能保证会调用用户注册的回调),并在循环执行一次后返回。

传递给 Ev::stop()EvLoop::stop() 的标志

Ev::BREAK_CANCEL

取消中断操作。

Ev::BREAK_ONE

使最里面的 Ev::run() (或 EvLoop::run())调用返回。

Ev::BREAK_ALL

使所有嵌套的 Ev::run() (或 EvLoop::run())调用返回。

监视器优先级

Ev::MINPRI

允许的最小监视器优先级。

Ev::MAXPRI

允许的最大监视器优先级。

(接收的)事件的位掩码

Ev::READ

EvIo 监视器中的文件描述符已变为可读。

Ev::WRITE

EvIo 监视器中的文件描述符已变为可写。

Ev::TIMER

EvTimer 监视器已超时。

Ev::PERIODIC

EvPeriodic 监视器已超时。

Ev::SIGNAL

EvSignal::__construct() 中指定的信号已接收。

Ev::CHILD

EvChild::__construct() 中指定的 pid 已收到状态更改。

Ev::STAT

EvStat 监视器中指定的路径已更改其属性。

Ev::IDLE

EvIdle 监视器在没有其他监视器可执行的操作时工作。

Ev::PREPARE

所有 EvPrepare 监视器在 Ev::run() 开始之前被调用。 因此,EvPrepare 监视器是在事件循环休眠或轮询新事件之前调用的最后一个监视器。

Ev::CHECK

所有 EvCheck 监视器在 Ev::run() 收集到新事件之后被排队,但在排队接收到的任何事件的任何回调之前。 因此,EvCheck 监视器将在事件循环迭代中在相同或更低优先级的任何其他监视器之前被调用。

Ev::EMBED

EvEmbed 监视器中指定的嵌入式事件循环需要关注。

Ev::CUSTOM

从未被 libev 本身发送(或以其他方式使用),但可以由 libev 用户随意使用来发出监视器信号(例如,通过 EvWatcher::feed())。

Ev::ERROR

发生了未指定的错误,监视器已停止。 这可能发生是因为监视器无法正常启动,因为 libev 内存不足,发现文件描述符已关闭或其他任何问题。 Libev 将这些视为应用程序错误。 另请参见 » ANATOMY OF A WATCHER

后端标志

Ev::BACKEND_SELECT

select(2) 后端

Ev::BACKEND_POLL

poll(2) 后端

Ev::BACKEND_EPOLL

Linux 特定 epoll(7) 后端,用于 2.6.9 之前的内核和 2.6.9 之后的内核

Ev::BACKEND_KQUEUE

kqueue 后端,用于大多数 BSD 系统。 EvEmbed 监视器可用于将一个循环(使用 kqueue 后端)嵌入到另一个循环中。 例如,可以尝试使用 kqueue 后端创建事件循环,并将其用于套接字。

Ev::BACKEND_DEVPOLL

Solaris 8 后端。 这尚未实现。

Ev::BACKEND_PORT

Solaris 10 事件端口机制,具有良好的可扩展性。

Ev::BACKEND_ALL

尝试所有后端(即使是损坏的后端)。 不建议显式使用它。 这里应该应用按位运算符(例如 Ev::BACKEND_ALL & ~ Ev::BACKEND_KQUEUE)。 使用 Ev::recommendedBackends(),或者根本不指定任何后端。

Ev::BACKEND_MASK

不是后端,而是从 flags 值中选择所有后端位的掩码,以屏蔽任何后端(例如,当修改 LIBEV_FLAGS 环境变量时)。

注意:

在模块初始化阶段,对于默认循环,Ev 通过 pthread_atfork (如果可用)注册 » ev_loop_fork 调用。

注意:

Ev 类中有一些方法提供了对默认事件循环的访问(例如 Ev::iteration()Ev::depth() 等)。 对于自定义循环(使用 EvLoop::__construct() 创建),可以通过 EvLoop 类的相应属性和方法访问这些值。

默认事件循环本身的实例可以通过 EvLoop::defaultLoop() 方法获取。

目录

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top