&reftitle.examples;
Temporizadores simples
stop();
// Para o observador se outras chamadas causarem mais de 10 iterações
Ev::iteration() >= 10 and $w->stop();
});
// Cria um cronômetro parado. Ele ficará inativo até que nós mesmos o iniciemos
$w_stopped = EvTimer::createStopped(10, 5, function($w) {
echo "Função de retorno de um temporizador criado como parado\n";
// Para o observador após 2 iterações
Ev::iteration() >= 2 and $w->stop();
});
// Faz um laço até que Ev::stop() seja chamado ou todos os observadores parem
Ev::run();
// Começa e vê se funciona
$w_stopped->start();
echo "Executa uma única iteração\n";
Ev::run(Ev::RUN_ONCE);
echo "Reinicia o segundo observador e tenta lidar com os mesmos eventos, mas não bloqueia\n";
$w2->again();
Ev::run(Ev::RUN_NOWAIT);
$w = new EvTimer(10, 0, function() {});
echo "Executando um laço de bloqueio\n";
Ev::run();
echo "FIM\n";
?>
]]>
&example.outputs.similar;
Temporizador periódico. Marcação a cada 10,5 segundos
]]>
Temporizador periódico. Usar retorno de chamada de reagendamento
]]>
Temporizador periódico. Marcação a cada 10,5 segundos a partir de agora
]]>
Espera até que STDIN esteja legível
]]>
Usa alguma E/S assíncrona para acessar um soquete
stop();
// Para de escrever o observador
$w->stop();
$in = "HEAD / HTTP/1.1\r\n";
$in .= "Host: google.co.uk\r\n";
$in .= "Connection: Close\r\n\r\n";
if (!socket_write($socket, $in, strlen($in))) {
trigger_error("Falha ao escrever $in no soquete", E_USER_ERROR);
}
$read_watcher = new EvIo($socket, Ev::READ, function ($w, $re)
use ($socket, $e_nonblocking)
{
// O soquete é legível. recv() 20 bytes usando modo sem bloqueio
$ret = socket_recv($socket, $out, 20, MSG_DONTWAIT);
if ($ret) {
echo $out;
} elseif ($ret === 0) {
// Tudo lido
$w->stop();
socket_close($socket);
return;
}
// Captura EINPROGRESS, EAGAIN, ou EWOULDBLOCK
if (in_array(socket_last_error(), $e_nonblocking)) {
return;
}
$w->stop();
socket_close($socket);
});
Ev::run();
});
$result = socket_connect($socket, $address, $service_port);
Ev::run();
?>
]]>
&example.outputs.similar;
Incorporando um laço em outro
]]>
Incorporando laço criado com back-end kqueue no laço padrão
]]>
Lidar com sinal SIGTERM
stop();
});
Ev::run();
?>
]]>
Monitora alterações em /var/log/messages
attr();
if ($attr['nlink']) {
printf("Tamanho atual: %ld\n", $attr['size']);
printf("Horário de acesso atual: %ld\n", $attr['atime']);
printf("Horário de moficiação atual: %ld\n", $attr['mtime']);
} else {
fprintf(STDERR, "O arquivo `messages` não existe!");
$w->stop();
}
});
Ev::run();
?>
]]>
Monitora as alterações de /var/log/messages. Evita perder atualizações com um atraso de um segundo
stop();
$stat = $w->data;
// 1 segundo após a alteração mais recente do arquivo
printf("Tamanho atual: %ld\n", $stat->attr()['size']);
});
$stat = new EvStat("/var/log/messages", 0., function () use ($timer) {
// Redefine o observador do cronômetro
$timer->again();
});
$timer->data = $stat;
Ev::run();
?>
]]>
Mudanças de status de processo
stop();
printf("Processo %d encerrado com status %d\n", $w->rpid, $w->rstatus);
});
Ev::run();
// Proteção contra zumbis
pcntl_wait($status);
} else {
//filho bifurcado
exit(2);
}
?>
]]>