写点什么

Swoole 定时器能实现毫秒级任务调度,你敢相信吗?

作者:CRMEB
  • 2022 年 5 月 09 日
  • 本文字数:1195 字

    阅读完需:约 4 分钟

Swoole 定时器能实现毫秒级任务调度,你敢相信吗?

简介


Timer 毫秒精度的定时器,底层基于 epoll_waitsetitimer 实现,数据结构使用 最小堆,可支持添加大量定时器,使用最小堆数据结构实现的定时器,类似 JavaScript 的 setIntervalSwoole 定时器的添加和删除,全部为内存操作,因此性能是非常高的。


Swoole 中的 TimerPHP 本身的 pcntl_alarm 是不同的。pcntl_alarm 是基于 时钟信号 + tick 函数实现,一个是最大仅支持到秒,另一个是不支持同时设定多个定时器程序,性能相对来说会比较差。


间隔时钟定时器


我们可以通过 Timer::tick 来实现间隔时钟定时器,定时器会持续触发,每隔指定时间自动触发执行回调函数, 直到调用 Timer::clear 来清除指定的定时器。


$i = 0;
Swoole\Timer::tick(1000, function(i) {
global $i;
echo "tick id:$id i:$i \n";
$i++;

});

复制代码
  • 每隔 1 秒时间触发一次回调函数,回调函数会自动打印一行信息到控制台。


一次性定时器


需要执行一次定时器的时候可以使用 Timer::after , 此函数是一个一次性定时器,与间隔时钟定时器不同,执行完成后就会销毁,需要注意的是 Timer::after 是非阻塞的。


Swoole\Timer::after(2000, function () {
echo "执行一次的after\n";

});
复制代码


  • 2 秒后执行回调函数,执行完成后自动退出。


清除定时器


Timer::after 执行完成后会自动退出,不需要清除,而 Timer::tick 没有清除定时器操作,会一直执行,直到程序退出。 当不需要定时器的时候,我们可以使用 Timer::clear 来达到停止定时器的目的,将对应定时器 id 传入该方法即可。


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


$i = 0;
Swoole\Timer::tick(1000, function (i) {
global $i;
echo "tick id:$id i:$i \n";
$i++;
if ($i > 10) {
Swoole\Timer::clear($id);
}

});
复制代码


  • 每隔 1 秒执行一次回调函数,当 $i 自增到 10 时,关闭定时器,此时程序会自动退出。


清除所有定时器


Timer::clearAll 用来清除同一进程空间中的计时器。基本上与 Timer::clear 相同,但 Timer::clearAll 可以一次性清除所有活动的计时器。


Swoole\Timer::tick(2000, function () {
echo "tick \n";
});
$str = "Swoole";
Swoole\Timer::after(1000, function() use ($str) {
echo "Hello, $str\n";

});Swoole\Timer::clearAll();结尾
复制代码


​ 定时器功能可以很方便的实现定时任务,例如 CRMEB Pro 系统 中的自动取消订单、自动确认收货、自动商品上下架、自动到期租户等操作就是基于 Timer::tick 来实现的。


CRMEB Pro 系统 以卓越的系统性能,个性的后台操作,丰富的营销功能,精细化的用户运营,裂变式分销,个性化传播,解决电商引流、推广难题,帮助企业打造生态级 B2C 盈利模式商城。


开源地址码云地址:http://github.crmeb.net/u/defu


Github 地址:http://github.crmeb.net/u/defu


开源不易,Star 以表尊重,感兴趣的朋友欢迎 Star,提交 PR,一起维护开源项目,造福更多人!

用户头像

CRMEB

关注

还未添加个人签名 2021.11.02 加入

CRMEB就是客户关系管理+营销电商系统实现公众号端、微信小程序端、H5端、APP、PC端用户账号同步,能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、会员维护、网络营销的一款企业应用

评论

发布
暂无评论
Swoole 定时器能实现毫秒级任务调度,你敢相信吗?_CRMEB_InfoQ写作社区