已經(jīng)onWorkerStart 準(zhǔn)備了一個(gè)Timer了,定時(shí)為60秒
這個(gè)Timer里面有些任務(wù)要執(zhí)行,執(zhí)行中監(jiān)控了時(shí)間
比如:目前執(zhí)行時(shí)間已經(jīng)到40秒了,待這次任務(wù)完畢后下次我想調(diào)整這個(gè)Timer間隔
$timeInt = 60;
Timer:add($timeInt, function(){
// 任務(wù)處理
// 假設(shè)到這里已經(jīng)過(guò)去40秒
// 任務(wù)結(jié)束
// 最后
// 比如,這里我要調(diào)整 $timeInt = 60 + 40
// 此時(shí)Timer從原來(lái)的60秒執(zhí)行一次變?yōu)榱?00秒執(zhí)行一次
})
不知道描述清楚沒(méi)有,能不能這么做?或者有其他更好的方案
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秒運(yùn)行一次,即從上次運(yùn)行后開(kāi)始計(jì)算60秒而不是每60秒;
改了下你試試應(yīng)該OK的。
你可以看看自身場(chǎng)景,我的場(chǎng)景是每次查詢接口都需要等60秒后再執(zhí)行下次查詢,所以我是onWorkerStart時(shí)候就調(diào)用(首次查詢),然后通過(guò)一次性timer進(jìn)行下一次的查詢。但按你上面發(fā)出來(lái)的信息,應(yīng)該onWorkerStart 的時(shí)候直接調(diào)用一次task()就行了,task里面就有Timer默認(rèn)60秒執(zhí)行,執(zhí)行完再計(jì)算下次執(zhí)行時(shí)間設(shè)置一次性Timer
需要注意下,如果業(yè)務(wù)量大,如果只添加(Timer::add)而不刪除的話,會(huì)不會(huì)導(dǎo)致生成大量Timer任務(wù)?最好Timer::del一下之前的