• swoole_timer_tick
    • 回调函数
    • 定时器校正
    • 协程模式
    • 使用示例

    swoole_timer_tick

    设置一个间隔时钟定时器,与after定时器不同的是tick定时器会持续触发,直到调用swoole_timer_clear清除。

    1. int swoole_timer_tick(int $msec, callable $callback, [$mixed $param]);
    • $msec 指定时间,单位为毫秒。如1000表示1秒,最大不得超过 86400000
    • $callback_function 时间到期后所执行的函数,必须是可以调用的
    • 可以使用匿名函数的use语法传递参数到回调函数中
    • 定时器仅在当前进程空间内有效
    • 定时器是纯异步实现的,不能与阻塞IO的函数一起使用,否则定时器的执行时间会发生错乱
    定时器在执行的过程中可能存在一定误差

    回调函数

    定时器触发的回调函数接受2个参数。第二个参数 $param 为可选参数

    1. function callbackFunction(int $timer_id, [$mixed $param]);
    • $timer_id 定时器的ID,可用于swoole_timer_clear清除此定时器
    • $paramsswoole_timer_tick传入的第三个参数$param,此参数也为可选参数

    定时器校正

    定时器回调函数的执行时间不影响下一次定时器执行的时间。实例:在0.002s设置了10mstick定时器,第一次会在0.012s执行回调函数,如果回调函数执行了5ms,下一次定时器仍然会在0.022s时触发,而不是0.027s

    但如果定时器回调函数的执行时间过长,甚至覆盖了下一次定时器执行的时间。底层会进行时间校正,丢弃已过期的行为,在下一时间回调。如上面例子中0.012s时的回调函数执行了15ms,本该在0.022s产生一次定时回调。实际上本次定时器在0.027s才返回,这时定时早已过期。底层会在0.032s时再次触发定时器回调。

    协程模式

    在协程环境下swoole_timer_tick回调中会自动创建一个协程,可以直接使用协程相关API,无需调用go创建协程。

    可设置enable_coroutine关闭自动创建协程

    使用示例

    1. swoole_timer_tick(1000, function(){
    2. echo "timeout\n";
    3. });

    正确示例

    1. swoole_timer_tick(3000, function () {
    2. echo "after 3000ms.\n";
    3. swoole_timer_after(14000, function () {
    4. echo "after 14000ms.\n";
    5. });
    6. });

    错误示例

    1. swoole_timer_tick(3000, function () {
    2. echo "after 3000ms.\n";
    3. sleep(14);
    4. echo "after 14000ms.\n";
    5. });