Php Laravel时间表-每小时、每天-了解确切开始时间

Php Laravel时间表-每小时、每天-了解确切开始时间,php,laravel,laravel-5,laravel-5.5,laravel-scheduler,Php,Laravel,Laravel 5,Laravel 5.5,Laravel Scheduler,来自Laravel的示例: 请注意每日功能 我不知道,它怎么知道什么时候开始? 它总是在午夜开始还是在随机浮动时间开始 我试图阅读源代码: /** * Schedule the event to run daily. * * @return $this */ public function daily() { return $this->spliceIntoPosition(1, 0) ->spliceIntoPosition(2, 0

来自Laravel的示例:

请注意每日功能

我不知道,它怎么知道什么时候开始? 它总是在午夜开始还是在随机浮动时间开始

我试图阅读源代码:

/**
 * Schedule the event to run daily.
 *
 * @return $this
 */
public function daily()
{
    return $this->spliceIntoPosition(1, 0)
                ->spliceIntoPosition(2, 0);
}
所以我检查了位置函数:

    /**
 * 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));
}
最后我完全迷路了。知道它是如何工作的吗?

指定它每天运行的确切时间

daily();    // Run the task every day at midnight
在你加上

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
对于您的crontab,Laravel将每分钟调用调度程序,并在每次调用时评估您计划的任务并运行到期的任务

我建议您阅读规则及其工作原理,这将让您了解为何在此处调用函数paticeIntoPosition(),以及它的作用

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 ...] 
因此,对于在执行该调用之后的daily(),我们得到:

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

快速查看,它似乎相当复杂,但总体而言:

\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等时间运行,这就是为什么您应该将计划程序设置为每分钟运行一次。

因此,如果我设置
daily()
,php脚本是每天在服务器时区运行还是在php时区运行?(我的服务器和php似乎有不同的时区,我不打算改变它)。也就是说,如果我将
->delete()
dailyAt(“13:00”)
一起使用,记录会在13:00服务器时间或13:00 php时间被删除吗?如果我有->dailyAt('02:00');cron将在2:03运行此计划任务是否会运行/当cron守护进程未运行时,在此时间内的任何作业都不会启动cron将运行,我的示例如下:我已在scheduler->dailyAt('02:00');中设置了一些任务;。Cron-laravel调度程序不是每分钟运行一次,而是每5分钟运行一次,比如说,出于性能原因。所以cron在凌晨1:57运行,然后在凌晨2:02运行。调度器现在是在每天(02:00)执行任务,还是忽略它?从前面的回答和我的调查中,我理解它是工作的,如果您的
计划:run
cron在凌晨1:57和凌晨2:02运行,并且您有一个设置为运行
每天('2:00')的命令
,将不执行此命令。
return $this->getNextRunDate($currentDate, 0, true)->getTimestamp() == $currentTime;