设置一个间隔时钟定时器,与after
定时器不同的是tick
定时器会持续触发,直到调用swoole_timer_clear
清除。
int swoole_timer_tick(int $msec, callable $callback);
$msec
指定时间,单位为毫秒。如1000
表示1秒
,最大不得超过 86400000
$callback_function
时间到期后所执行的函数,必须是可以调用的use
语法传递参数到回调函数中定时器在执行的过程中可能存在一定误差
定时器触发的回调函数接受2
个参数。
function callbackFunction(int $timer_id, mixed $params = null);
$timer_id
定时器的ID,可用于swoole_timer_clear
清除此定时器$params
由swoole_timer_tick
传入的第三个参数定时器回调函数的执行时间不影响下一次定时器执行的时间。实例:在0.002s
设置了10ms
的tick
定时器,第一次会在0.012s
执行回调函数,如果回调函数执行了5ms
,下一次定时器仍然会在0.022s
时触发,而不是0.027s
。
但如果定时器回调函数的执行时间过长,甚至覆盖了下一次定时器执行的时间。底层会进行时间校正,丢弃已过期的行为,在下一时间回调。如上面例子中0.012s
时的回调函数执行了15ms
,本该在0.022s
产生一次定时回调。实际上本次定时器在0.027s
才返回,这时定时早已过期。底层会在0.032s
时再次触发定时器回调。
swoole_timer_tick(1000, function(){
echo "timeout\n";
});
正确示例
swoole_timer_tick(3000, function () {
echo "after 3000ms.\n";
swoole_timer_after(14000, function () {
echo "after 14000ms.\n";
});
});
错误示例
swoole_timer_tick(3000, function () {
echo "after 3000ms.\n";
sleep(14);
echo "after 14000ms.\n";
});