請(qǐng)問(wèn)怎么定時(shí)每天9:00執(zhí)行指定任務(wù) ?
我需要每天9:00執(zhí)行一些操作,然后重啟worker子進(jìn)程
$worker->onWorkerStart = function($worker)
{
Timer::add(1, function(){
if('09:00:00' == date('H:i:s'))
{
//這里寫(xiě)業(yè)務(wù)邏輯
Worker::stopAll();
}
}, [], true);
};
另外你還可以使用crontab精準(zhǔn)控制定時(shí)器,然后在指定的時(shí)間發(fā)送事件到worker進(jìn)程(開(kāi)個(gè)業(yè)務(wù)端口)來(lái)處理。
每秒做一次判斷,顯然消耗太大了,最小精確到分鐘即可。另外建議做法是計(jì)算出下個(gè)9點(diǎn)相差的秒數(shù),設(shè)一個(gè)這個(gè)秒數(shù)的定時(shí)器即可,幾乎無(wú)消耗。如果怕錯(cuò)過(guò)9點(diǎn),那肯定要通過(guò)一定的邏輯,保存要執(zhí)行的任務(wù)列表,或者使用延遲消息隊(duì)列。
用Java的elastic_job
用workerman的定時(shí)器,
用系統(tǒng)的crontab,
用環(huán)形隊(duì)列自己實(shí)現(xiàn),
用redis的消息失效訂閱通知
都可以實(shí)現(xiàn),看你的業(yè)務(wù),怕錯(cuò)過(guò)可以跑異步任務(wù)
像上面的代碼,可以定義個(gè)時(shí)間范圍,,然后在那個(gè)范圍查詢(xún)數(shù)據(jù)庫(kù)有沒(méi)有執(zhí)行記錄,沒(méi)有就執(zhí)行下去,然后添加執(zhí)行記錄,我就是一直這樣寫(xiě)的