Как работают cron и планировщик задач в Laravel

Как работают cron и планировщик задач в Laravel

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

На самом деле все это описано в официальной документации здесь, но эта страница довольно длинная, и я хочу сократить ее до основных вещей, которые вам нужно знать. Тем не менее вы можете захотеть прочитать полную версию документации позже.

Основы: Задания Cron

Как люди раньше запускали периодические автоматические задания? С помощью так называемых cron-заданий, установленных на сервере. Чтобы настроить задание на выполнение, например, каждый час, нужно отредактировать текстовый файл crontab и добавить строку:

 0 * * * * sh /path/to/script.sh 

Эти звездочки означают разные периоды:

минутычасыдни месяцамесяцыдни недели

Итак, в приведенном выше случае сервер должен выполнять script.sh во все часы в 0 минут, что будет 9:00, 10:00, 11:00 и т.д. Один раз каждый час.

Таким образом, вы добавляете больше заданий, подобных этому, с разным синтаксисом для разных периодов.

На самом деле, вы можете использовать файл crontab и для выполнения команд Laravel artisan. Например:


0 9 * * * sh /path/to/your/project/php artisan some:command

Это позволит выполнять php artisan some:command каждый день в 9:00.

Но ведь неудобно подключаться к серверу и настраивать все это вручную на всех серверах, верно? Вот тут-то и приходит на помощь функция Laravel Task Scheduler.

Планировщик задач Laravel

Laravel позволяет перечислить все ваши команды в определенном файле app/Console/Kernel.php, и вам нужно добавить только одну команду cron на ваш сервер:


* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Это означает, что каждую минуту будет выполняться php artisan schedule:run и проверять, есть ли команды для выполнения.

Вот основной метод по умолчанию в app/Console/Kernel.php:


class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')->hourly();
}

}

Вот пример синтаксиса для ввода команд в расписание:


$schedule->[command]()->[when_to_execute]();

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

Существует множество различных удобных для человека вариантов синтаксиса для ”когда выполнять”. Вот несколько примеров:

->everyTwoMinutes() 
->hourly() 
->dailyAt('13:00') 
->weeklyOn(1, '8:00')

И т.д.

Вы можете проверить их все в этом разделе документации.

Кроме того, в этом случае можно выполнить различные команды:

Artisan команды: $schedule->command(‘emails:send Taylor —force’)

Jobs: $schedule->job(new Heartbeat)

Shell commands: $schedule->exec(‘node /home/forge/script.js’)

И это основы, которые вам необходимо знать и понимать Планирование задач в Laravel. Для получения подробной информации и других возможностей читайте официальную документацию.