如何在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天后的日期不是周三,这次调度就会跳过,可能导致间隔超过两周,所以不如方案一灵活可靠。
快速测试方法
你可以通过以下方式验证逻辑是否正确:
- 临时修改
when()闭包里的返回值为true,执行php artisan schedule:run,看命令是否被执行。 - 修改返回值为
false,再次执行,确认命令被跳过。
内容的提问来源于stack exchange,提问作者latr.88
相关产品推荐
相关产品推荐

