(PECL ev >= 0.2.0)
Ev 是一个静态类,提供对默认循环和一些常见操作的访问。
传递给创建循环的标志
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() 方法获取。