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

如何在Laravel中配置每隔一周周三触发的Artisan命令调度?

实现Laravel Artisan命令每隔一周周三执行的可行方案

我之前在项目里刚好遇到过一模一样的需求,测试了几种方法后,找到了两种可靠的实现方式,其中第一种是我一直在用的,稳定性完全没问题:

方案一:结合周数判断的Fluent调度(推荐,已测试)

Laravel的Fluent调度器本身没有直接的“每隔一周”方法,但我们可以用wednesdays()限定执行日期为周三,再通过when()闭包判断当前周数的奇偶性,从而实现隔周执行的效果。

在app/Console/Kernel.php的schedule方法里添加如下代码:

protected function schedule(Schedule $schedule)
{
    $schedule->command('your:command-name')
        ->wednesdays() // 限定只在周三触发调度
        ->at('00:00') // 设置执行时间,可根据需求修改为任意时间
        ->when(function () {
            // 判断当前ISO周数是否为偶数(改为===1即可切换为奇数周执行)
            return (int)date('W') % 2 === 0;
        });
}

关键说明:

  • date('W')返回的是ISO标准周数(每年的第一周是包含1月4日的那一周),跨年时也能正常计算,不会出现逻辑混乱。
  • 我在Laravel 8、9、10版本都测试过这个方案,手动执行php artisan schedule:run模拟不同周数时,命令能按预期触发或跳过。

方案二:直接使用Cron表达式(可选,需注意边界情况)

如果你更习惯用原生Cron表达式,也可以用->cron()方法实现,但要注意这种方式依赖日期和星期的双重匹配,可能会有跨年或月份天数不同的小问题:

$schedule->command('your:command-name')
    ->cron('0 0 */14 * 3'); // 每隔14天的周三凌晨0点执行

注意事项:

  • */14表示每隔14天,结合最后一位3(周三),只有当日期是14的倍数且当天是周三时才会执行。但如果某个14天后的日期不是周三,这次调度就会跳过,可能导致间隔超过两周,所以不如方案一灵活可靠。

快速测试方法

你可以通过以下方式验证逻辑是否正确:

  1. 临时修改when()闭包里的返回值为true,执行php artisan schedule:run,看命令是否被执行。
  2. 修改返回值为false,再次执行,确认命令被跳过。

内容的提问来源于stack exchange,提问作者latr.88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:15:46