You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:06:29