全部
常见问题
产品动态
精选推荐

Swoole定时器实现毫秒级任务调度

管理 管理 编辑 删除

简介

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

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

间隔时钟定时器

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

$i = 0;

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

   global $i;

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

   $i++;

});

513c9202305131517487144.png

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

一次性定时器

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

Swoole\Timer::after(2000, function () {

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

});

c7248202305131517593843.png

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

清除定时器

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

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

$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);

   }

});

31163202305131518142605.png

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

请登录后查看

徐斗明 最后编辑于2023-09-13 16:43:32

快捷回复
回复
回复
回复({{post_count}}) {{!is_user ? '我的回复' :'全部回复'}}
排序 默认正序 回复倒序 点赞倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level }}

作者 管理员 企业

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推荐': '推荐'}}
{{item.is_suggest == 1? '取消推荐': '推荐'}}
沙发 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暂无简介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
{{item.like_count}}
{{item.showReply ? '取消回复' : '回复'}}
删除
回复
回复

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回复 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回复' : '回复'}}
删除
回复
回复
查看更多
1554
{{like_count}}
{{collect_count}}
添加回复 ({{post_count}})

相关推荐

快速安全登录

使用微信扫码登录
{{item.label}} 加精
{{item.label}} {{item.label}} 板块推荐 常见问题 产品动态 精选推荐 首页头条 首页动态 首页推荐
取 消 确 定
回复
回复
问题:
问题自动获取的帖子内容,不准确时需要手动修改. [获取答案]
答案:
提交
bug 需求 取 消 确 定

微信登录/注册

切换手机号登录

{{ bind_phone ? '绑定手机' : '手机登录'}}

{{codeText}}
切换微信登录/注册
暂不绑定
CRMEB客服

CRMEB咨询热线 咨询热线

400-8888-794

微信扫码咨询

CRMEB开源商城下载 源码下载 CRMEB帮助文档 帮助文档
返回顶部 返回顶部
CRMEB客服