Laravel Scheduler and Cron-Laravel如何知道不运行基于daily(),hourly()等的计划作业

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel Scheduler and Cron-Laravel如何知道不运行基于daily(),hourly()等的计划作业相关的知识,希望对你有一定的参考价值。

在Laravel,在我的内核中,我有:

protected $commands = [
    Commands\SendRenewEmails::class,
];

/**
 * Define the application's command schedule.
 *
 * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
 * @return void
 */
protected function schedule(Schedule $schedule)
{
    // $schedule->command('inspire')
    //          ->hourly();
    $schedule->command('renew:emails')
        ->daily();
}

如果我通过Artisan手动运行此功能,则上述功能renew:emails将按预期工作。

在我的crontab中,我有:

* */8 * * * cd /path-to-my-project && php artisan schedule:run >> /dev/null 2>&1

我必须每8个小时运行一次,而不是在* * * * *时每分钟运行一次,因为这是为了测试而实时运行,并且只是为了确保任务没有每分钟运行。

所以如何 Laravel知道,何时在内核上执行日常工作,以及何时发生?

此设置(这似乎是Laravel中cronjobs的基本设置,但每分钟运行一次,而不是每8小时运行一次),没有日志(我可以看到),并且DB中没有表可以跟踪这个。

因此,如果我在哪里将cron设置为* * * * *,Laravel如何知道not每分钟运行计划的作业,仅仅因为我将->daily();放在了作业的结尾?

而且当我有daily();时,那是什么时候?而hourly();在什么时间?

TL; DR:Laravel如何知道是否不应该再次运行相同的作业,例如使用daily();规则?此信息存储在哪里?如果我的cronjobs daily();std:out每分钟,我如何确定带有规则php artisan schedule:run的工作不会每分钟运行?

答案

在后台,Laravel Scheduler使用https://github.com/dragonmantank/cron-expression确定是否计划在给定的schedule:run调用分钟运行命令或作业。

您计划的每个任务都会转换为cron expression,然后将其传递到程序包中。然后,对该表达式运行名为isDue的方法,以确定是否应运行该方法。因此,如果您将任务设置为运行hourly,则isDue将在每小时的最高时间产生true,Laravel将在cron周期内执行该任务。

这样,信息就不需要存储在任何地方,因为可以随时进行确定。

这也可能使您想知道,如果您有一个长时间运行的任务,而该任务可能要花费比间隔更长的时间。这是withoutOverlapping进入图片的地方。当被调用时,它会在最初运行任务时创建一个称为互斥锁的互斥锁,类似于某种“锁”(有关更多信息,请参见What is a mutex?)。如果某个特定任务在随后的周期中已经存在互斥锁,则表示该任务当前正在另一周期中运行,因此不应在此周期中再次触发。

互斥锁存储在哪里?简单:Laravel将它们存储在缓存中,当互斥任务完成时,互斥将从缓存中删除。因此循环继续进行。

我可以在这里进一步详细介绍,但是我认为这在很大程度上回答了您的问题。

以上是关于Laravel Scheduler and Cron-Laravel如何知道不运行基于daily(),hourly()等的计划作业的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel Scheduler 时视图未导出到文件

Laravel Scheduler作业触发失败事件,即使它没有失败

论文阅读:Fast, Scalable, and Programmable Packet Scheduler in Hardware

Quartz 第二课 Jobs and Triggers(官方文档翻译)

使用Cro :: WebSocket :: Client添加授权或标头?

.NET 任务调度