作者:漂流小叶子2502896817 | 来源:互联网 | 2023-07-12 08:24
Swoole 提供了异步高精度定时器功能,该功能类似 Javascript 的 setInterval/setTimeout,粒度为毫秒级。定时器的添加和删除,全部为内存操作,无 IO 消耗,因此性能是非常高的。
Swoole 实现的定时器与 PHP 自带的 pcntl_alarm 不同,pcntl_alarm 是基于时钟信号和 tick 函数实现的,最大仅支持到秒,此外不支持同时设定多个定时器程序,性能也很差。
Swoole 提供了两种类型的定时器,一种是每隔一定时间执行的定时器,一种是指定时间后一次性执行的定时器,下面我们来看看这两种定时器的实现和使用。
间隔时钟定时器
在 Swoole 中,我们可以通过 Timer::tick 实现间隔时钟定时器,该定时器会每隔指定时间触发回调函数的执行:
\Swoole\Timer::tick(1000, function () {
echo "Swoole 很棒\n";
});
Swoole 定时器需要在 PHP CLI 模式下才能运行,上述代码的意思是每隔 1000ms 执行一次回调函数打印字符串:
![](https://img6.php1.cn/3cdc5/9921/42f/d920fc1bac5b2a1c.png)
指定时钟定时器
此外,还可以通过 Timer::after 定义一个指定时间后执行的定时器,与间隔时钟定时器不同,这种定时器是一次性的,执行完成后就会销毁:
\Swoole\Timer::after(3000, function () {
echo "Laravel 也很棒\n";
});
上述定时器的含义是 3000ms 后执行指定的回调函数,并且执行之后就退出程序:
![](https://img6.php1.cn/3cdc5/9921/42f/dac23a12b8b3e66a.png)
清除定时器
对于一次性执行的指定时钟定时器,不用关心清除问题,而对于间隔时钟定时器,如果不定义清楚逻辑的话,会永远执行下去,直到程序退出,我们可以通过 Timer::clear 删除定时器来达到清除的目的,在具体实现的时候,将定时器 ID 传入该方法即可,上面两种定时器定义方法都会返回对应的定时器 ID, 因此,清除定时器可以作用于上述两种定时器:
/*$timerId = \Swoole\Timer::tick(1000, function () {
echo "Swoole 很棒\n";
});*/
$timerId = \Swoole\Timer::after(1000, function () {
echo "Laravel 也很棒\n";
});
\Swoole\Timer::clear($timerId);
这种情况下,两个定时器都不会调用,对于间隔时钟定时器,还可以这么清除:
$count = 0;
\Swoole\Timer::tick(1000, function ($timerId, $count) {
global $count;
echo "Swoole 很棒\n";
$count++;
if ($count == 3) {
\Swoole\Timer::clear($timerId);
}
}, $count);
这种情况下,定时器会在执行三次后退出:
![](https://img6.php1.cn/3cdc5/9921/42f/d500d4c7a1e96c92.png)
PS: 人见人爱,花见花开,车见车爆胎的号主,你还不关注么?反正据说帅的一塌糊涂的人都关注了哦!
![](https://img6.php1.cn/3cdc5/9921/42f/00fc8f3baa5ea027.jpeg)
好文章,我在看❤️