Laravel 5 - 没有重叠的任务计划不起作用

Laravel 5 - Task schedule withoutOverlapping not working

我尝试 运行 安排 Laravel 5。当我 运行 这个:

时它工作正常
$schedule->call(function() {
   // do something here..
})->everyMinute();

但是当我添加 withoutOverlapping() 时,调度程序从未 运行 任务:

$schedule->call(function () {
   // do something here..
})->everyMinute()->name('job_name')->withoutOverlapping();

*这些时间表代码写在/app/Console/Kernel。php

在使用 ->withoutOverlapping() 时删除 ->everyMinute() 它仍然会每分钟 运行 但不会重叠。

更新

从 Laravel v. 5.5+ 开始,您可以指定在 "without overlapping" 锁过期之前必须经过多少分钟。

例如。 ->withoutOverlapping(10) 可用于在 10 分钟后解锁 "overlapping"。

顺序很重要,但从未被提及。

试试这个

$schedule->call(function () {
   // do something here..
})->name('job_name')->withoutOverlapping()->everyMinute();

这对我来说是这样的:

(1) call -> (2) name -> (3) withoutOverlapping -> (4) dailyAt -> (5) onOneServer

当你弄乱订单时,你可能会遇到类似

的错误

A scheduled event name is required to prevent overlapping. Use the name method before 'withoutOverlapping'.

Call to undefined method Illuminate\Console\Scheduling\Schedule::name()

withoutOverlapping 方法在执行命令时创建互斥文件,并在执行完成时删除互斥文件。

调度程序检查是否存在任何不允许再次执行的命令的互斥文件。

在您的情况下,互斥文件不会被删除,它会阻止命令再次 运行。

您可以清除 laravel 缓存以使其再次使用 php artisan cache:clear

cron withoutOverlapping() 正在运行。让我们了解它是如何工作的 例如:

$schedule->command('command')
                    ->hourly()
                    ->withoutOverlapping();

withoutOverlapping 表示当cron 运行时,它会在storage/framework/ 目录中生成一个锁定文件,一旦完成,它将删除锁定文件。现在下次开始,它将检查锁定文件是否存在。如果有锁定文件,则意味着前一个 cron 未完成,并且不允许 cron 与前一个重叠。

In this scenario, the lock file is there into the storage/framework/ directory so that the cron is not working

锁定文件如下所示: schedule-random_string 例如:schedule-0bfdb7f0bc14b27d84c7d6f2a2528e85b0847fc6

修复: 删除或重命名锁定文件 (storage/framework/schedule-0bfdb7f0bc14b27d84c7d6f2a2528e85b0847fc6)