Laravel执行php artisan schedule:run报InvalidArgumentException错误求助
问题原因与解决方案
错误提示Invalid CRON field value 30 at position 4的核心问题是:你误用了Laravel调度器的->days()方法。
CRON表达式的第4个位置对应星期几,有效值只能是0-6(0代表周日,6代表周六)或英文缩写(如SUN/MON)。而你传入的config('marketplace.days_old_messages')等值是30,这显然超出了星期字段的有效值范围,导致验证失败。
注意:Laravel的->days()方法是用来指定具体星期几执行任务的,比如->days([1,3])表示周一、周三执行,不是用来设置“每隔N天执行”的。
正确的写法
如果你的需求是每隔N天执行一次任务,应该使用Laravel 8及以上版本提供的->everyNdays()方法:
protected function schedule(Schedule $schedule) { // 每隔指定天数删除旧消息 $schedule->command(DeleteOldMessages::class, ['days' => config('marketplace.days_old_messages')]) ->everyNdays(config('marketplace.days_old_messages')); // 每隔指定天数释放采购单 $schedule->command(ReleasePurchasesCommand::class, ['days' => config('marketplace.days_old_purchases')]) ->everyNdays(config('marketplace.days_old_purchases')); // 每隔指定天数完成采购单 $schedule->command(CompletePurchaseCommand::class) ->everyNdays(config('marketplace.days_complete')); }
替代方案(低版本Laravel)
如果你的Laravel版本低于8.x,没有everyNdays()方法,可以直接使用CRON表达式的日字段来实现:
// 示例:每隔30天执行一次 $schedule->command(...) ->cron('0 0 */30 * *');
这里*/30表示每隔30天,对应CRON的日字段位置(从0开始数是位置2)。
内容的提问来源于stack exchange,提问作者Rikozi
相关产品推荐
相关产品推荐

