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