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));
}
最终我完全迷失了。任何想法如何表现?
答案 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运行等等,这就是为什么您应该将调度程序设置为每分钟运行一次。