(PECL ev >= 0.2.0)
Os observadores EvIo verificam se um descritor de arquivo (ou soquete, ou um fluxo convertível em descritor de arquivo numérico) pode ser lido ou escrito em cada iteração do laço de eventos, ou, mais precisamente, quando a leitura não bloquearia o processo e a escrita seria pelo menos capaz de gravar alguns dados. Esse comportamento é chamado de acionamento de nível porque os eventos continuam sendo recebidos enquanto a condição persistir. Para parar de receber eventos, basta parar o observador.
O número de observadores de eventos de leitura e/ou gravação por
fd
é ilimitado. Definir todos os descritores de arquivo para o modo sem bloqueio também
costuma ser uma boa ideia (mas não é obrigatório).
Outra coisa a observar é que é muito fácil receber falsas
notificações de prontidão, ou seja, o retorno de chamada pode ser chamado com
Ev::READ
mas um
read()
subsequente irá na verdade, bloquear porque não há dados. É muito fácil entrar
nesta situação. Portanto, é melhor sempre usar E/S sem bloqueio: Um
read()
extra retornando
EAGAIN
(ou similar) é muito preferível a um programa suspenso até que alguns dados
cheguem.
Se por algum motivo for impossível executar o
fd
no modo sem bloqueio, teste novamente separadamente se um descritor de arquivo está
realmente pronto. Algumas pessoas usam
SIGALRM
e um temporizador de intervalo, apenas para ter certeza de que o thry não bloqueará infinitamente.
Sempre considere usar o modo sem bloqueio.
$fd
,$events
,$callback
,$data
= ?,$priority
= ?$fd
,$events
,$callback
,$data
= null
,$priority
= 0