我想知道Laravel是否有一个内置的功能,只有在前一个任务完成时才运行计划任务。
我需要每隔几秒钟运行一个特定的任务,但是这个任务依赖于查询另一个可能在某个时刻失去连接的主机。
如果没有的话,我想有几种方法可以做到这一点:
- 让任务刚刚将作业放入队列
- 保存一个标志(作为文件或数据库),在任务开始时设置,在完成时取消设置。
只是希望任务调度程序有内置的东西在我走这两条路之前…
在文档中找到了答案:D
https://laravel.com/docs/5.3/scheduling摘录:
防止任务重叠
默认情况下,即使任务的前一个实例仍在运行,计划任务也将运行。为了防止这种情况,您可以使用withoutoverlap方法:
$schedule->command('emails:send')->withoutOverlapping();
在本例中,如果emails:send
Artisan命令尚未运行,则该命令将每分钟运行一次。如果您的任务在执行时间上变化很大,那么withoutOverlapping
方法特别有用,这可以防止您准确预测给定任务将花费多长时间。