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