El watcher EvPeriodic funciona en diferentes
modos según los parámetros offset
,
interval
y reschedule_cb
.
El modo Temporizador absoluto. En este modo,
interval
= 0
,
reschedule_cb
= null
.
La llamada se realizará a la hora del reloj offset
y no se repetirá. No se ajustará cuando ocurra un salto en el tiempo,
por lo tanto, si debe ejecutarse el 1 de enero de 2014,
se ejecutará cuando la hora del sistema sea alcanzada o superada.
El modo Temporizador con repetición por intervalo.
En este modo, interval
> 0
,
reschedule_cb
= null
; el watcher será programado
automáticamente para finalizar en la próxima duración
offset
+ N
* interval
(para un entero N
) y luego se repite, independientemente
de los saltos en el tiempo.
Puede utilizarse para crear temporizadores que no derivan respetando el reloj del sistema:
<?php
$hourly = EvPeriodic(0, 3600, NULL, function () {
echo "una vez por hora\n";
});
?>
3600
segundos
entre cada llamada, sino solo que la función de retrollamada será llamada
cuando el reloj del sistema muestre una hora completa (UTC).
La clase EvPeriodic intentará ejecutar la función
de retrollamada en este modo a la próxima hora posible donde
time = offset
(mod
interval
), independientemente de los saltos en el tiempo.
El modo reprogramación manual. En este modo,
reschedule_cb
es un callable.
interval
y offset
serán ambos ignorados. En su lugar, cada vez que el watcher periódico
esté programado, la función de retrollamada de reprogramación (reschedule_cb
)
será llamada con el watcher primero y el tiempo actual como segundo argumento.
Esta función de retrollamada no debe detener ni destruir
este watcher periódico, ni otro, y no debe
llamar a funciones o métodos de bucle de eventos. Para detenerlo,
devuelva 1e30
y deténgalo después. Un watcher
EvPrepare puede ser utilizado para realizar esta tarea.
Debe devolver la próxima hora de llamada, basada en el valor del tiempo pasado (el valor de tiempo más pequeño debe ser superior o igual al segundo argumento). Será llamada, habitualmente, justo después de que la función de retrollamada sea lanzada, pero posiblemente en otros momentos.
Ejemplo #1 Utilización de retrollamada de reprogramación
<?php
// Cada 10.5 segundos
function reschedule_cb ($watcher, $now) {
return $now + (10.5 - fmod($now, 10.5));
}
$w = new EvPeriodic(0., 0., "reschedule_cb", function ($w, $revents) {
echo time(), PHP_EOL;
});
Ev::run();
?>