Мой вопрос больше общего интереса. У меня есть две команды, созданные с помощью 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
Система планировщика 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 на самом деле не знает, что он изменился — он просто проверяет каждый раз, когда работает, и использует то, что находит.
В частности, вот цепочка через код, если это интересно:
php artisan
в командной строке запустим кустарный файл в корне проекта;defineConsoleSchedule()
метод на себя;defineConsoleSchedule()
метод инициализирует пустой объект Schedule (Illuminate \ Console \ Scheduling \ Schedule);schedule()
метод класса Kernel; и наконецschedule()
метод, в котором вы определили свое командное расписание, будут выполнены два ваших запроса к БД, и ваши две записи расписания будут определены со значениями, которые БД возвращает в этот момент.Вышеуказанные действия происходят каждый раз, когда консольное приложение загружается, что означает при каждом вызове php artisan
независимо от того, какую команду вы хотите запустить.
При запуске расписания: запустите команду специально, вот что происходит дальше:
fire()
метод вызывается для объекта ScheduleRunCommand, который выполняет все команды, определенные в объекте Schedule при загрузке приложения; а такжеisDue()
метод для события (Illuminate \ Console \ Scheduling \ Event), представляющий команду; и наконецtrue
от isDue()
будет работатьДругих решений пока нет …