1.
config/app.php
return [
'debug' => true,
'default_timezone' => 'Asia/Shanghai',
];
2.
process/test.php
(每天早上10點 和 11點,這樣是可以準(zhǔn)時執(zhí)行的,查看對應(yīng)的日志,有內(nèi)容輸出)
public function onWorkerStart(Worker $worker)
{
$workerId = $worker->id;
new Crontab('0 0 10,11 * * *', function () use ($workerId) {
echo date('Y-m-d H:i:s') . PHP_EOL;
});
}
3.
但如果把定時任務(wù)換成如下(每天凌晨1點 和 每天凌晨4點)
定時任務(wù)就不會執(zhí)行
public function onWorkerStart(Worker $worker)
{
$workerId = $worker->id;
new Crontab('0 0 1,4 * * *', function () use ($workerId) {
echo date('Y-m-d H:i:s') . PHP_EOL;
});
}
4.
0 0 1,4 * * *
,啟動服務(wù),今天早上發(fā)現(xiàn)沒有對應(yīng)的日志輸出0 0 10,11 * * *
,然后 restart
服務(wù) 0 10,11 * * *
這是10點11點
0 1,4 * * *
這是 1點4點
下班之前,定時任務(wù),設(shè)置為 0 0 1,4 * * *
,啟動服務(wù),早上來公司,發(fā)現(xiàn)沒有日志輸出
然后,再調(diào)整為0 10,11 * * *
,早上10點 和 早上11點,有日志輸出
這就有問題了啊
為啥凌晨的任務(wù)沒有執(zhí)行呢
定時任務(wù)的執(zhí)行規(guī)則,在分鐘級的定義時,與 Linux 的 crontab 命令的規(guī)則一致,在秒級的定義時,規(guī)則長度從 5 位變成 6 位,在規(guī)則的前面增加了對應(yīng)秒級的節(jié)點,也就是 5 位時以分鐘級規(guī)則執(zhí)行,6 位時以秒級規(guī)則執(zhí)行,如 /5 則代表每 5 秒執(zhí)行一次。注意在注解定義時,規(guī)則存在 \ 符號時,需要進(jìn)行轉(zhuǎn)義處理,即填寫 \/5
為什么設(shè)置為 new Crontab('0 1,4 * * *'
,在凌晨1點 和 凌晨4點,依然沒有執(zhí)行呢?
先學(xué)習(xí)一下crontab表達(dá)式:https://www.runoob.com/linux/linux-comm-crontab.html
寫入日志的,是這樣的
Db::table(CustomerModel::$table)
->where(CustomersEntity::TBC_star_balance, '>', 0)
->select([CustomersEntity::TBC_id, CustomersEntity::TBC_level_id])
->chunkById(10000, function ($customers) {
/**
* 通過隊列處理,啟動多個消費者,提高處理速度
*/
Client::send((new CheckCustomerLevelConsumer())->queue, json_encode(['customers' => $customers]));
});
因為沒有符合條件的結(jié)果,所以永遠(yuǎn)不會走到回調(diào)函數(shù)內(nèi),所以不會發(fā)送數(shù)據(jù)到隊列里
我在隊列里,把接收到的數(shù)據(jù),寫入日志
你最好是移除掉你的業(yè)務(wù)邏輯,直接使用系統(tǒng)自帶日志系統(tǒng)Log(Log::info('xxxxxxxxxxxx')),嘗試記錄日志。先排查是不是定時任務(wù)插件的問題。繼而排查業(yè)務(wù)問題。(初步判斷是你業(yè)務(wù)和隊列有問題)