Swoole提供了毫秒精度的定时器,全部操做都是内存操做,无额外的IO开销。php
下面让咱们一块儿详细了解每一个函数的做用:编程
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 语法传递参数到回调函数中。spa
$params:给执行函数传递数据【此参数也为可选参数】设计
返回值:定时器的IDcode
示例:协程
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");
注意事项:blog
定时器的校订:定时器回调函数的执行时间不影响下一次定时器执行的时间。实例:在 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的讨论。
--------------------------- 我是可爱的分割线 ----------------------------
最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同窗点击连接,联系我吧。