Как Laravel знает, когда планировщик был обновлен?

Мой вопрос больше общего интереса. У меня есть две команды, созданные с помощью Laravel, давайте назовем их A и B.

Каждая из этих команд запланирована с помощью метода -> dailyAt ($ par). Но параметр $ par исходит из запроса.

Я имею в виду что-то вроде этого:

protected function schedule(Schedule $schedule)
{
$schedulerTime_commandA = App\Model\CommandsTime::where('id', 1)->first()->time;
$schedulerTime_commandB = App\Model\CommandsTime::where('id', 2)->first()->time;

$schedule->command('A')
->dailyAt($schedulerTime_commandA);

$schedule->command('B')
->dailyAt($schedulerTime_commandB);
}

Это связано с тем, что суперпользователь хочет запланировать время выполнения этих команд. Мой вопрос здесь: откуда Laravel знает, что этот метод расписания в файле App \ Console \ Kernel.php был изменен?

ПРИМЕЧАНИЕ: у меня есть следующая запись cron, так как Laravel рассказывает об этом в документации.

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1

3

Решение

Система планировщика Laravel работает так: она использует задание cron, которое запускается раз в минуту (это * * * * * участие в записи cron: сопоставлять каждую минуту каждого часа каждого дня каждого месяца каждого года).

Так что каждую минуту php /path/to/artisan schedule:run >> /dev/null 2>&1 управляется cron.

Когда эта команда выполняется, она должна проверить расписание в соответствии с schedule() метод в классе ядра когда он запускается.

Технически, Laravel не знает, что расписание изменилось само по себе. Каждую минуту он должен бежать, ударить schedule() метод, который будет получать последние значения из базы данных, а затем возвращать расписание как это установлено в эту конкретную минуту во времени.

Каждый отдельный запуск cron ничего не знает ни о тех, что были до него, ни о тех, которые придут после него.

По крайней мере, это мое понимание планировщика. Я только провел немного времени в основном коде Laravel Kernel, но я верю этому тому, что происходит из моего собственного опыта.

Надеюсь, это поможет!


Редактировать 1

Просто подтвердил мою логику в коде Laravel. Каждый раз, когда запускается скрипт cron, расписание перестраивается, поэтому изменения в расписании в базе данных будут использоваться при следующем запуске записи cron. Laravel на самом деле не знает, что он изменился — он просто проверяет каждый раз, когда работает, и использует то, что находит.

В частности, вот цепочка через код, если это интересно:

  1. призвание php artisan в командной строке запустим кустарный файл в корне проекта;
  2. В кустарном файле приложение загружается и инициализируется объект ядра;
  3. Когда класс Kernel инициализируется, конструктор для класса Kernel (Laravel \ Lumen \ Console \ Kernel) вызывает defineConsoleSchedule() метод на себя;
  4. defineConsoleSchedule() метод инициализирует пустой объект Schedule (Illuminate \ Console \ Scheduling \ Schedule);
  5. Пустой объект Schedule будет передан schedule() метод класса Kernel; и наконец
  6. в schedule() метод, в котором вы определили свое командное расписание, будут выполнены два ваших запроса к БД, и ваши две записи расписания будут определены со значениями, которые БД возвращает в этот момент.

Вышеуказанные действия происходят каждый раз, когда консольное приложение загружается, что означает при каждом вызове php artisanнезависимо от того, какую команду вы хотите запустить.

При запуске расписания: запустите команду специально, вот что происходит дальше:

  1. После начальной загрузки приложения объект ScheduleRunCommand (Illuminate \ Console \ Scheduling \ ScheduleRuneCommand) инициализируется; а также
  2. fire() метод вызывается для объекта ScheduleRunCommand, который выполняет все команды, определенные в объекте Schedule при загрузке приложения; а также
  3. Проверяет каждую команду, чтобы увидеть, должна ли эта команда выполняться в это время, вызывая isDue() метод для события (Illuminate \ Console \ Scheduling \ Event), представляющий команду; и наконец
  4. Каждая команда, которая должна быть выполнена в эту минуту, возвращая true от isDue() будет работать
6

Другие решения

Других решений пока нет …

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