График Laravel — ежечасно, ежедневно — понимание, когда именно начать

Пример из Laravel документация:

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

И в конце концов я полностью потерялся. Есть идеи как это ведет себя?

3

Решение

Выглядит быстро, это кажется довольно сложным, но в целом:

\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 и так далее, поэтому вы должны иметь Планировщик настроен на запуск каждую минуту.

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 будет вызывать планировщик каждую минуту и ​​при каждом вызове будет оценивать ваши запланированные задачи и запускать задачи, которые должны быть выполнены.

Я рекомендую прочитать о хрон и как работают правила, и это даст вам представление, почему там вызывается функция 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 ...]

Таким образом, для daily () после этого вызова spliceIntoPosition () мы получаем:

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

По вопросам рекламы [email protected]