Laravel9如何设置定时任务每周一、四、周六午夜自动执行
Laravel 9 Scheduler 调整定时任务执行周期配置方案
核心修改方式
直接修改app/Console/Kernel.php中的调度配置即可,不需要调整服务器层的Cron入口条目,推荐优先使用框架提供的语义化频率约束方法,符合Laravel最佳实践,可读性更强。
推荐写法(语义化配置)
原有配置中->everyThirtyMinutes()替换为周度+指定星期的组合约束即可,保留原有的日志写入配置:
// 顶部引入调度类,无需引入可直接使用数字对应星期 use Illuminate\Console\Scheduling\Schedule; protected function schedule(Schedule $schedule) { $schedule->command('getWeather:current') // 基础规则:每周午夜0点执行 ->weekly() // 限定仅周一、周四、周六触发 ->days([ Schedule::MONDAY, Schedule::THURSDAY, Schedule::SATURDAY ]) // 可选:添加防重叠锁,避免第三方接口响应慢导致任务重复执行,锁默认超时10分钟 ->withoutOverlapping() // 保持原有日志追加写入配置,不要替换为sendOutputTo避免覆盖历史日志 ->appendOutputTo('/var/log/scheduled_weather.log'); }
如果不想引入类常量,days()方法直接传数字数组也可以,星期对应规则为:0=周日、1=周一、2=周二、3=周三、4=周四、5=周五、6=周六,即->days([1,4,6])效果和传常量完全一致。
原生Cron表达式写法
如果习惯直接写Cron规则,也可以直接用cron()方法定义,效果和上述写法完全相同:
protected function schedule(Schedule $schedule) { $schedule->command('getWeather:current') // Cron表达式顺序:分 时 日 月 周,对应每周一、周四、周六00:00执行 ->cron('0 0 * * 1,4,6') ->withoutOverlapping() ->appendOutputTo('/var/log/scheduled_weather.log'); }
校验与注意事项
- 配置修改完成后,执行项目根目录下
php artisan schedule:list命令,可直接查看所有调度任务的执行周期、下一次执行时间,确认getWeather:current对应的执行时间为周一、周四、周六0点即配置正确。 - 提前确认
config/app.php中timezone配置和服务器系统时区一致,例如国内环境需设置为Asia/Shanghai,避免时区差导致执行时间偏移。 - 服务器层的Cron入口无需修改,保持原有配置即可:即每分钟执行一次
php artisan schedule:run的系统Cron条目,所有频率判断由框架内部完成,之前能正常跑30分钟周期任务说明这部分配置是正常的。 - 功能测试不需要等到午夜触发,执行
php artisan schedule:test命令,在交互列表中选择getWeather:current任务即可手动触发一次,确认数据拉取、缓存写入、日志记录逻辑正常。 - 配置保存后不需要重启服务,代码部署到服务器后新规则会自动生效。
内容的提问来源于stack exchange,提问作者trafers
相关产品推荐
相关产品推荐

