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的讨论。
--------------------------- 我是可爱的分割线 ----------------------------
最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。