框架进阶 - 定时器

优质
小牛编辑
137浏览
2023-12-01

EasySwoole对定Swoole时器进行了封装。

loop

  1. //10秒执行一次
  2. Timer::loop(10*1000,function (){
  3. Logger::getInstance()->console("this is timer");
  4. });

delay

  1. //10秒后执行一次
  2. Timer::delay(10*1000,function (){
  3. Logger::getInstance()->console("this is timer");
  4. });

注意:定时器不能在服务启动之前使用。在服务启动以后,添加的定时器仅仅在当前进程中有效。在workerStart事件中添加定时器时,请注意判断需要添加定时器的workerId,否在该定时器在每个进程中均会被执行。

  1. //为第一个worker添加一个定时器
  2. if($workerId == 0){
  3. //10秒
  4. Timer::loop(10*1000,function (){
  5. Logger::getInstance()->console("this is timer");
  6. });
  7. }

实例

  1. function onWorkerStart(swoole_server $server, $workerId)
  2. {
  3. // TODO: Implement onWorkerStart() method.
  4. //如何避免定时器因为进程重启而丢失
  5. //例如,我第一个进程,添加一个10秒的定时器
  6. if($workerId == 0){
  7. //每十秒执行一次
  8. Timer::loop(10*1000,function (){
  9. time();
  10. //从数据库,或者是redis中,去获取下个就近10秒内需要执行的任务
  11. //例如:2秒后一个任务,3秒后一个任务
  12. //那幺
  13. Timer::delay(2*1000,function (){
  14. //为了防止因为任务阻塞,引起定时器不准确,吧任务给异步进程处理
  15. Logger::getInstance()->console("time 2",false);
  16. });
  17. Timer::delay(3*1000,function (){
  18. //为了防止因为任务阻塞,引起定时器不准确,吧任务给异步进程处理
  19. Logger::getInstance()->console("time 3",false);
  20. });
  21. });
  22. }
  23. }

经典案例-订单状态超时监控

场景说明:在很多抢购的场景中,订单下单完成后,需要限制其付款时间,或者是在棋牌游戏中,需要对房间状态进行监控。那幺我们
可以先把待监控的订单或者是房间压入redis队列中。那幺利用定时器+异步进程,去实现对订单状态的循环监控。