Laravel非重叠计划作业未执行

lin*_*san 2 laravel laravel-5

我有一个Laravel Scheduled作业,其定义Kernel.php如下

$schedule->call('\App\Http\Controllers\ScheduleController@processQueuedMessages')
    ->everyFiveMinutes()
    ->name('process_queued_messages')
    ->withoutOverlapping();
Run Code Online (Sandbox Code Playgroud)

在开发过程中,由于语法错误,我的工作引发了异常。我更正了错误并尝试再次执行;但由于某种原因它不会。

我试了artisan down然后artisan up。我也尝试过重新启动服务器实例。但是没有任何帮助。作业只是没有执行(也不例外)。

我意识到问题是由于->withoutOverlapping()。Laravel调度程序以某种方式认为该作业已经在运行,因此不再执行它。

lin*_*san 5

我通过查看供应商代码找到了解决方案。

Illuminate\Console\Scheduling\CallbackEvent.php
Run Code Online (Sandbox Code Playgroud)

它在本地存储中创建一个名为的文件schedule-*

public function withoutOverlapping()
{
    if ( ! isset($this->description))
    {
        throw new LogicException(
            "A scheduled event name is required to prevent overlapping. Use the 'name' method before 'withoutOverlapping'."
        );
    }

    return $this->skip(function()
        {
            return file_exists($this->mutexPath());
        });
}

protected function mutexPath()
{
    return storage_path().'/framework/schedule-'.md5($this->description);
}
Run Code Online (Sandbox Code Playgroud)

删除文件schedule-*storage/framework解决了这个问题。

  • 请注意,锁存储在您选择的缓存中。就我而言,我们使用的是 redis。我必须在 Redis 中查找/删除密钥。 (3认同)

kap*_*dev 5

我也有这个问题。对此没有适当的解决方案,但解决方法可以解决该问题。

转到项目的 storage/framework 文件夹并删除所有文件schedule-***********

然后再次尝试运行 cron。即使您使用它也会如此withoutOverlapping() function

希望这对你有用。如有疑问请询问。


nma*_*tis 5

对于任何阅读此文件的人,自己删除日程表文件不是正确的方法。您需要指定-锁定时间-基于锁定时间,如果没有Overlapping,则会阻止其他任务运行。

Laravel-任务计划中所述

如果需要,您可以指定“无重叠”锁到期之前必须经过的分钟数。默认情况下,锁定将在24小时后失效:

您的问题源于以下事实:无重叠应用24小时默认锁。因此,您必须等待24小时才能接受类似的任务。只需根据您的需要调整锁定时间,即可:

$ schedule-> command('emails:send')-> withoutOverlapping(10); //其中10代表分钟


Sim*_*mon 5

这对我来说很有效:

php artisan cache:clear
Run Code Online (Sandbox Code Playgroud)