(PECL ev >= 0.2.0)
EvIo 观察器在事件循环的每次迭代中检查文件描述符(或套接字,或可转换为数字文件描述符的流)是否可读或可写,或者更准确地说,是读取是否不会阻塞进程,以及写入是否至少能够写入一些数据。这种行为称为 *级别触发*,因为只要条件持续存在,事件就会一直接收。要停止接收事件,只需停止观察器。
每个 fd
的读和/或写事件观察器数量是无限的。将所有文件描述符设置为非阻塞模式通常也是一个好主意(但不是必需的)。
另一个需要注意的是,很容易收到错误的准备就绪通知,即回调可能会被调用,其中包含
,但随后的 read() 实际上会阻塞,因为没有数据。很容易陷入这种状况。因此,最好始终使用非阻塞 I/O:与程序挂起直到某些数据到达相比,额外的返回 Ev::READ
EAGAIN
(或类似)的 read() 更可取。
如果由于某种原因,无法以非阻塞模式运行 fd
,则分别重新测试文件描述符是否真正准备就绪。有些人还会使用 SIGALRM
和一个间隔计时器,只是为了确保不会无限期地阻塞。
始终考虑使用非阻塞模式。
$fd
,$events
,$callback
,$data
= null
,$priority
= 0