PHP Conference Japan 2024

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认为这些是应用程序错误。另请参见» 观察器的剖析

后端标志

Ev::BACKEND_SELECT

select(2)后端

Ev::BACKEND_POLL

poll(2)后端

Ev::BACKEND_EPOLL

Linux特有的epoll(7)后端,适用于 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