(PECL swoole >= 1.9.0)
Temporizador con precisión de milisegundos. La implementación subyacente se basa en epoll_wait y setitimer, con una estructura de datos de montículo mínimo que permite añadir un gran número de temporizadores.
En los procesos con E/S síncrona, como los procesos Manager y TaskWorker, se implementa mediante setitimer y señales.
En los procesos con E/S asíncrona, se implementa mediante el tiempo de espera de epoll_wait/kevent/poll/select.
El sistema subyacente no admite temporizadores con un retardo de
0; los valores inferiores a 1
milisegundo emiten un E_WARNING y la llamada falla.
Esto difiere de lenguajes como Node.js.
Swoole\Event::defer()
puede utilizarse para obtener una funcionalidad similar.
<?php
Swoole\Event::defer(function () {
echo "hola\n";
});
?>Corrección del temporizador: el tiempo de ejecución de la función de retrollamada no afecta al instante de la siguiente ejecución. Por ejemplo, para un temporizador tick de 10 ms creado en 0,002 s, la primera retrollamada se ejecuta en 0,012 s; si la función de retrollamada tarda 5 ms, el siguiente disparo se produce igualmente en 0,022 s, y no en 0,027 s.
En cambio, si la función de retrollamada tarda demasiado, hasta cubrir el instante de la siguiente ejecución, el sistema subyacente corrige el tiempo: descarta los disparos vencidos y vuelve a llamar a la función en el siguiente instante disponible. Por ejemplo, si la retrollamada ejecutada en 0,012 s tarda 15 ms, lo que retrasa el temporizador previsto para 0,022 s, la retrollamada se dispara de nuevo en 0,032 s.
De forma predeterminada, cuando un temporizador se dispara se crea automáticamente una corrutina para ejecutar la función de retrollamada. Este comportamiento puede desactivarse con swoole_async_set().
Un temporizador solo funciona en el espacio del proceso actual.
Los temporizadores son puramente asíncronos e incompatibles con las funciones de E/S síncrona.
La ejecución de un temporizador puede presentar ligeras desviaciones de tiempo.