Swoole从入门到入土(21)——毫秒定时器

Swoole提供了毫秒精度的定时器,所有操作都是内存操作,无额外的IO开销。

下面让我们一起详细了解每个函数的作用:

1) 函数tick:设置一个间隔时钟定时器,这个定时器会持续触发

Swoole\Timer::tick(int $msec, callable $callback_function, ...$params): int

$mesc:指定时间,单位毫秒【如 1000 表示 1 秒,v4.2.10 以下版本最大不得超过 86400000】

$callback_function:时间到期后所执行的函数,必须是可以调用的,格式为:callbackFunction(int $timer_id, ...$params),可以使用匿名函数的 use 语法传递参数到回调函数中。

$params:给执行函数传递数据【此参数也为可选参数】

返回值:定时器的ID

示例:

Swoole\Timer::tick(3000, function (int $timer_id, $param1, $param2) {
    echo "timer_id #$timer_id, after 3000ms.\n";
    echo "param1 is $param1, param2 is $param2.\n";

    Swoole\Timer::tick(14000, function ($timer_id) {
        echo "timer_id #$timer_id, after 14000ms.\n";
    });
}, "A", "B");

注意事项:

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

协程模式:在协程环境下 Timer::tick 回调中会自动创建一个协程,可以直接使用协程相关 API。

 

2) 函数after():在指定的时间后执行函数。Swoole\Timer::after 函数是一个一次性定时器,执行完成后就会销毁。此函数与 PHP 标准库提供的 sleep 函数不同,after 是非阻塞的。

Swoole\Timer::after(int $msec, callable $callback_function, ...$params): int

$mesc:指定时间,单位毫秒【如 1000 表示 1 秒,v4.2.10 以下版本最大不得超过 86400000】

$callback_function:时间到期后所执行的函数,必须是可以调用的,格式为:callbackFunction(int $timer_id, ...$params),可以使用匿名函数的 use 语法传递参数到回调函数中。

$params:给执行函数传递数据【此参数也为可选参数】

返回值:定时器的ID

示例:

$timer_id=Swoole\Timer::tick(1000, function () {
    echo "after 1000ms.\n";
});
Swoole\Timer::after(10000,function() use ($timer_id){
    echo "clear:\n";
    Swoole\Timer::clear($timer_id);
});

 

3) 函数clear():使用定时器 ID 来删除定时器。

Swoole\Timer::clear(int $timer_id): bool

$timer_id:定时器 ID【调用 Timer::tick、Timer::after 后会返回一个整数的 ID】

注意:Swoole\Timer::clear 不能用于清除其他进程的定时器,只作用于当前进程

 

4) clearAll():清除当前 Worker 进程内的所有定时器。

Swoole\Timer::clearAll(): bool

 

5) info():返回 timer 的信息。

Swoole\Timer::info(int $timer_id): array

返回值示例:

array(4) {
  ["exec_msec"]=>
  int(1000)
  ["interval"]=>
  int(0)
  ["round"]=>
  int(0)
  ["removed"]=>
  bool(false)
}

 

6) 函数list():返回定时器迭代器,可使用 foreach 遍历当前 Worker 进程内所有 timer 的 id

Swoole\Timer::list(): Swoole\Timer\Iterator

示例:

foreach (Swoole\Timer::list() as $timer_id) {
    var_dump(Swoole\Timer::info($timer_id));
}

 

7) 函数stat():查看定时器状态。

Swoole\Timer::stats(): array

返回值示例:

array(3) {
  ["initialized"]=>
  bool(true)
  ["num"]=>
  int(1000)
  ["round"]=>
  int(1)
}

 

8) 函数set():设置定时器相关参数。

Swoole\Timer::set(array $array): void

例如:默认定时器在执行回调函数时会自动创建协程,可单独设置定时器关闭协程。

Swoole\Timer::set([
  'enable_coroutine' => false,
]);

 

Swoole毫秒定时器的内容相对比较简单,这一节到此就要结束了。请关注后续的多进程与协程核心API的讨论。

 

 

---------------------------  我是可爱的分割线  ----------------------------

最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。

posted on 2021-01-06 20:34  咚..咚  阅读(514)  评论(0编辑  收藏  举报

导航