Laravel 5.4中everyMinute()方法失效报错求助
解决Laravel 5.4中everyMinute()调度报错的问题
我之前在Laravel 5.4开发时也碰到过这个一模一样的坑!当用->everyMinute()配置任务调度时,抛出In FieldFactory.php line 46: 5 is not a valid position错误,但换成->cron('* * * * *')就完全正常。下面给你分析原因和解决办法:
问题根源
这个错误是Laravel 5.4版本的一个已知bug:框架内部的FieldFactory类在验证cron字段位置时,错误地只允许位置1-4(对应分、时、日、月),但漏掉了第5个位置(星期字段)。而everyMinute()方法的底层实现,会触发对第5个位置的操作,从而触发这个无效位置的错误。
解决办法
1. 临时替代方案(最省心)
直接用cron('* * * * *')代替everyMinute(),两者的效果完全一致(都是每分钟执行一次),而且能绕过框架的bug。你的可用代码示例已经这么做了,继续用就好:
protected function schedule(Schedule $schedule) { $schedule->job(new TestJob())->cron('* * * * *'); }
2. 修复框架bug(彻底解决)
如果你不想一直用cron表达式,可以修改Laravel框架的FieldFactory.php文件:
- 找到项目根目录下的
vendor/laravel/framework/src/Illuminate/Console/Scheduling/FieldFactory.php - 定位到第46行的位置验证代码,把允许的位置范围从
1-4改成1-5(因为cron表达式有5个字段,对应位置1到5) - 修改后的代码大概是这样:
// 原错误代码 if (! in_array($position, [1, 2, 3, 4])) { throw new InvalidArgumentException("{$position} is not a valid position."); } // 修改后的正确代码 if (! in_array($position, [1, 2, 3, 4, 5])) { throw new InvalidArgumentException("{$position} is not a valid position."); }
不过要注意,修改vendor目录下的文件不是长久之计,下次执行composer update时可能会被覆盖。最好的办法是升级到Laravel 5.4的最新补丁版本,这个bug在后续的小版本更新中已经被修复了。
内容的提问来源于stack exchange,提问作者Player1
相关产品推荐
相关产品推荐

