Laravel通过App\Console\Kernel@schedule
方法正在(正确)运行计划的任务。它做到了无需持久层。以前运行的计划任务不会保存到数据库中,也不会存储在数据库中。
该“魔术”如何实现?我想加深了解。
我已经查看了源代码,可以看到通过四舍五入当前日期并将其与计划频率差异以及需要每分钟运行的事实在某种程度上实现了它,可以说一定程度的自信可以执行任务。这是我的解释,但我仍然不能完全理解如何保证按计划运行,以及如何处理故障或几秒钟后出现问题。
编辑由于注释中指出的清晰度问题而进行编辑。
通过“几秒钟”,我的意思是“四舍五入”方法是如何工作的,即使它每分钟运行一次,但不是同一秒运行-例如:第一次运行00:01.00,00:01:02, 00:02:04
也许要进一步澄清,并帮助理解它的工作原理,是否有边界保证?如果每分钟运行多次,它将在分钟内多次执行每分钟任务吗?
答案 0 :(得分:3)
Cronjob无法精确保证秒数。这就是为什么通常没有cronjob间隔少于一分钟的原因。因此,实际上,它无法处理“几秒钟后发生的事情”。
在laravel中,第一次运行调度命令后,服务器会问“是否有排队的作业?”,这是怎么回事?每一分钟。如果没有,它什么也不会做。
例如,以“每日” cronjob为例。调度程序不需要知道什么时候是最后一次运行任务或类似的时间。当它遇到日常cronjob时,它只是检查是否是午夜。如果是午夜,它将运行该作业。
另外,进行“每隔30分钟”的cronjob。也许您在10:25注册了cronjob。但还是第一次,它将在10:30而不是10:55上运行。不管您什么时候注册,或什么时候上次运行。它仅检查当前分钟是“ 00”还是被30整除。因此,它将在10:30运行。同样,它将在11:00运行。等等。
类似地,默认情况下,十分钟的cronjob将仅检查当前分钟是否可被十整除。因此,无论您注册命令的时间如何,它都只会在XX:00,XX:10,XX:20等上运行。
这就是为什么默认情况下它不需要存储以前运行的计划任务的原因。但是,如果您想进行监视,则可以将其存储到文件中。