Laravel:如何为多台指纹机同时运行多个调度任务
多台指纹机的调度任务实现方案
针对多台指纹机同时运行调度任务的需求,核心思路是为每台设备生成独立的调度任务,并让命令能识别目标设备,具体实现步骤如下:
1. 调整数据结构
确保你的WaktuMesin表新增machine_id字段,用来存储每台指纹机的唯一标识,每条记录对应一台设备的时段配置(pagi、siang、sore)。
2. 修改调度代码
不再仅获取单台设备的配置,而是查询所有设备的配置,循环为每台设备创建对应的调度任务,并将设备ID作为参数传递给命令:
protected function schedule(Schedule $schedule) { // 获取所有指纹机的时段配置 $allMachines = WaktuMesin::all(); foreach ($allMachines as $machine) { // 处理早班时间 $tarik_pagi = explode('-', $machine->pagi)[1]; $tarik_pagi_kehadiran = date('H:i', strtotime($tarik_pagi . ' +3 minutes')); // 处理中班时间 $tarik_siang = explode('-', $machine->siang)[1]; $tarik_siang_kehadiran = date('H:i', strtotime($tarik_siang . ' +3 minutes')); // 处理晚班时间 $tarik_sore = explode('-', $machine->sore)[1]; $tarik_sore_kehadiran = date('H:i', strtotime($tarik_sore . ' +3 minutes')); // 为当前设备创建调度任务,传递machine_id参数 $schedule->command("tarik:absen {$machine->machine_id}") ->everyMinute() ->timezone('Asia/Jakarta'); $schedule->command("send:wa {$machine->machine_id}") ->everyMinute() ->timezone('Asia/Jakarta'); $schedule->command("tarik:pagi {$machine->machine_id}") ->dailyAt($tarik_pagi_kehadiran) ->timezone('Asia/Jakarta'); $schedule->command("tarik:siang {$machine->machine_id}") ->dailyAt($tarik_siang_kehadiran) ->timezone('Asia/Jakarta'); $schedule->command("tarik:sore {$machine->machine_id}") ->dailyAt($tarik_sore_kehadiran) ->timezone('Asia/Jakarta'); } }
3. 修改命令逻辑
以tarik:absen命令为例,修改其代码以接收并使用machine_id参数:
命令的signature定义
protected $signature = 'tarik:absen {machine_id}';
命令的handle方法
public function handle() { $machineId = $this->argument('machine_id'); // 根据machine_id处理对应指纹机的打卡数据拉取逻辑 // 替换成你原有的业务代码,只需将操作范围限定为当前machine_id对应的设备 }
send:wa、tarik:pagi等其他命令都需要做类似修改,确保能接收machine_id参数,并针对目标设备执行任务。
关键说明
- 每台设备的调度任务相互独立,Laravel调度器会自动处理多任务的并发执行(只要服务器资源充足)。
- 即便多台设备的时段配置相同,调度器也会按各自的时间触发对应任务,无需额外处理。
- 要保证
machine_id在WaktuMesin表中唯一且有效,与每台指纹机的真实标识一一对应。
内容的提问来源于stack exchange,提问作者fathimah
相关产品推荐
相关产品推荐

