gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:50:42 25 4
gpt4 key购买 nike

在 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();
}

上述函数 renew:emails,如果我通过 Artisan 手动运行它,它会按预期工作。

在我的 crontab 中我有:

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

我让它每 8 小时运行一次,而不是在 * * * * * 每分钟运行一次,因为这是实时测试,只是为了确保任务不是每分钟运行一次。

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

从这个设置(这似乎是 Laravel 中 cronjobs 的基本设置,但每分钟而不是每 8 小时运行一次),没有日志(我可以看到),也没有数据库中的表来跟踪

所以如果我在哪里将我的 cron 设置为 * * * * *,Laravel 怎么知道每分钟运行计划的作业,只是因为我已经把->daily(); 在作业结束时?

当我有 daily(); 时,那是什么具体时间? hourly();具体是几点?

长话短说:Laravel 如何知道如果不应该再次运行相同的作业,例如使用 daily(); 规则?这些信息存储在哪里?如果我的 cronjobs std:outphp 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 和 Cron - Laravel 如何知道不运行基于 daily()、hourly() 等的计划作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62023526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com