前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swoole 定时器能实现毫秒级任务调度,你敢相信吗?

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

原创
作者头像
CRMEB商城源码
发布2022-05-09 11:52:07
5010
发布2022-05-09 11:52:07
举报
文章被收录于专栏:crmeb

简介

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

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

间隔时钟定时器

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

代码语言:javascript
复制
$i = 0;

Swoole\Timer::tick(1000, function($id) use ($i) {

    global $i;

    echo "tick id:$id i:$i \n";

    $i++;

});

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

一次性定时器

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

代码语言:javascript
复制
Swoole\Timer::after(2000, function () {

    echo "执行一次的after\n";

});

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

清除定时器

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

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

代码语言:javascript
复制
$i = 0;

Swoole\Timer::tick(1000, function ($id) use ($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` 可以一次性清除所有活动的计时器。

代码语言:javascript
复制
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 系统](https://crmeb.com/web/index/pro) 以卓越的系统性能,个性的后台操作,丰富的营销功能,精细化的用户运营,裂变式分销,个性化传播,解决电商引流、推广难题,帮助企业打造生态级 B2C 盈利模式商城。

开源地址

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开源地址
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档