workerman Timer动态定时,是否可行

thinkerdev

已有一个定时器,希望在定时器流程结束时重新调整定时器的间隔

已经onWorkerStart 准备了一个Timer了,定时为60秒
这个Timer里面有些任务要执行,执行中监控了时间
比如:目前执行时间已经到40秒了,待这次任务完毕后下次我想调整这个Timer间隔

$timeInt = 60;
Timer:add($timeInt, function(){
    // 任务处理

    // 假设到这里已经过去40秒

    // 任务结束

    // 最后
    // 比如,这里我要调整 $timeInt = 60 + 40
    // 此时Timer从原来的60秒执行一次变为了100秒执行一次
})

不知道描述清楚没有,能不能这么做?或者有其他更好的方案

502 2 2
2个回答

walkor

不支持更改定时器间隔,需要删除重新添加

  • thinkerdev 2024-01-15

    大佬,对于这种需求还有其他好的建议吗

MarkGo
function task($timeInt=60){
    Timer::add($timeInt,function(){
        try{
            $begTimes = time();
            //do sth
            $nextRunAt = (time() - $begTimes) + $timeInt;
        }catch (\Throwable $e){
        }finally{
            task($nextRunAt);
        }
    },null,false);
}

我需求和你差不多,是需要每次间隔60秒运行一次,即从上次运行后开始计算60秒而不是每60秒;
改了下你试试应该OK的。

  • thinkerdev 2024-01-15

    棒啊!函数体外面是不是还得套一层Timer?还是怎么来执行这个函数

  • MarkGo 2024-01-16

    你可以看看自身场景,我的场景是每次查询接口都需要等60秒后再执行下次查询,所以我是onWorkerStart时候就调用(首次查询),然后通过一次性timer进行下一次的查询。但按你上面发出来的信息,应该onWorkerStart 的时候直接调用一次task()就行了,task里面就有Timer默认60秒执行,执行完再计算下次执行时间设置一次性Timer

  • thinkerdev 2024-01-19

    根据你的代码提示改造了一下,可控定时器,nice!!!

  • zzlasp 2024-03-02

    需要注意下,如果业务量大,如果只添加(Timer::add)而不删除的话,会不会导致生成大量Timer任务?最好Timer::del一下之前的

🔝