简介
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++;
});
- 每隔 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 ($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
能够一次性革除所有流动的计时器。
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,一起保护开源我的项目,造福更多人!