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(官方文档翻译)