Laravel时间表 - 每小时,每天 - 了解何时开始

时间:2017-11-10 14:03:24

标签: php laravel laravel-5 laravel-5.5 laravel-scheduler

Laravel documentation的例子:

protected function schedule(Schedule $schedule)
{
    $schedule->call(function () {
        DB::table('recent_users')->delete();
    })->daily();
}

请注意每日功能。

我无法弄清楚,它将如何在何时开始? 它会始终在午夜或随机浮动时间开始吗?

我试着阅读源代码:

/**
 * Schedule the event to run daily.
 *
 * @return $this
 */
public function daily()
{
    return $this->spliceIntoPosition(1, 0)
                ->spliceIntoPosition(2, 0);
}

所以我检查了spliceIntoPosition函数:

    /**
 * Splice the given value into the given position of the expression.
 *
 * @param  int  $position
 * @param  string  $value
 * @return $this
 */
protected function spliceIntoPosition($position, $value)
{
    $segments = explode(' ', $this->expression);

    $segments[$position - 1] = $value;

    return $this->cron(implode(' ', $segments));
}

最终我完全迷失了。任何想法如何表现?

2 个答案:

答案 0 :(得分:1)

Laravel docs准确指定每天运行的时间

daily();    // Run the task every day at midnight

添加

后的Bassicaly
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

到您的crontab Laravel将每分钟调用一次调度程序,并且每次调用都将评估您的计划任务并运行到期的任务。

我建议阅读cron以及规则是如何工作的,这将让您了解为什么函数spliceIntoPosition()在那里被调用以及它的作用。

示例cron选项卡记录

* * * * * // will run every single minute
0 * * * * // will run every single hour at 30 [ 0:00, 1:00 ...] 
30 1 * * * // will run every single day at 1:30 [ Mon 1:30, Tue 1:30 ...] 

所以对于每天()之后的spliceIntoPosition()调用我们得到:

"0 0 * * *" // which will be called at 0:00 every single day

答案 1 :(得分:1)

快速看起来似乎相当复杂,但总的来说:

\Illuminate\Console\Scheduling\Event

你上课:

public $expression = '* * * * * *';

运行daily()方法时,它已更改为:

public $expression = '0 0 * * * *';

稍后在确定是否应该运行此事件时,同一个类中有isDue()个方法,它最终会调用:

CronExpression::factory($this->expression)->isDue($date->toDateTimeString())

在同一个类CronExpression中,你有isDue()方法,它最终将从同一个类运行getRunDate(),此方法计算下次运行此命令的时间,最后将其与当前时间:

return $this->getNextRunDate($currentDate, 0, true)->getTimestamp() == $currentTime;

所以回答你的问题似乎它会在确切的分钟运行,所以当你每隔5分钟使用一次时,它将在1:00,1:05,1:10运行等等,这就是为什么您应该将调度程序设置为每分钟运行一次。