$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function ($worker) {
try {
switch ($worker->id) {
case 0:
$timers = []; // 保存相關(guān)485網(wǎng)關(guān)的定時器任務(wù)
Timer::add(60, function () use (&$timers) { // 每隔1分鐘檢測一次數(shù)據(jù)庫的值, 查詢有沒有新建的設(shè)備
$service = app()->make(DeviceModelService::class);
$devices = $service->getActiveDevices(); // 假設(shè)這個方法返回所有需要定時任務(wù)的設(shè)備
foreach ($devices as $device) {
if (isset($timers[$device->id]) && $timers[$device->id]['interval'] != $device->ror_second) {
Timer::del($timers[$device->id]['timer_id']);
unset($timers[$device->id]);
}
if (!isset($timers[$device->id])) {
$timer_id = Timer::add($device->ror_second, function() use ($device){
// 執(zhí)行業(yè)務(wù)代碼
Device485::dispatch($device->device_id,$device->model_id, $device->address);
});
$timers[$device->id] = [
'timer_id' => $timer_id,
'interval' => $device->ror_second
];
}
}
});
break;
上面的代碼首選判斷間隔時間是否和數(shù)據(jù)庫設(shè)定的值相同,如果不同,則進(jìn)行刪除定時任務(wù),然后再次添加定時任務(wù)。
想知道Timer::del($timers[$device->id]['timer_id']);這個方法可以理解成在一個隊列中,把這個任務(wù)給清理掉了嗎?
沒看到timers數(shù)組的作用,要是我寫的話就這樣
if($worker->id == 0) {
Timer::add(60, function() {
$service = app()->make(DeviceModelService::class);
$devices = $service->getActiveDevices(); // 假設(shè)這個方法返回所有需要定時任務(wù)的設(shè)備
while($device = array_pop($devices)) {
Timer::add($device->ror_second, function() use ($device){
// 執(zhí)行業(yè)務(wù)代碼
Device485::dispatch($device->device_id,$device->model_id, $device->address);
});
}
})
}