Laravel: Как работает cron и планировщик задач
cronв контексте Laravel. У фреймворка есть механизм работающий поверх `crontab` в Linux, позвольте показать вам, как это работает.
На самом деле всё описано в официальной документации Laravel, но там довольно длинная страница, и я хочу сократить её до основных вещей, которые нужно знать. Тем не менее вы можете прочитать полную документацию попозже.
Основы: Задачи Cron
Итак, как раньше люди выполняли периодические автоматизированные задания? С так называемыми заданиям cron, настроенными на сервере. Например, чтобы настроить выполнение задания каждый час, вы должны отредактировать текстовый файл crontab
и добавить строку:
0 * * * * sh /path/to/script.sh
Эти звёздочки означают разные периоды:
- минуты
- часы
- дни месяца
- месяцы
- дни недели
Итак, в приведённом выше примере сервер должен выполнять script.sh
во все часы в 0 минут, то есть в 9:00, 10:00, 11:00 и т.д. Один раз в час
Таким образом, вы добавляете больше заданий с разным синтаксисом для разных периодов.
Фактически, вы также можете использовать файл crontab
для выполнения Laravel команд artisan
. Примерно так:
0 9 * * * sh /путь/к/вашему/проекту/php artisan some:command
Это задание cron будет выполнять команду php artisan some:command
каждый день в 9:00.
Но не удобно подключаться к серверу и настраивать всё это вручную на всех серверах, да? Вот где в игру вступает функция Laravel Task Scheduler.
Laravel Task Scheduler
Laravel позволяет вам перечислить все ваши команды в конкретном файле app/Console/Kernel.php
, и вам нужно добавить только одну команду cron на свой сервер:
* * * * * cd /путь-к-вашему-проекту && php artisan schedule:run >> /dev/null 2>&1
Это задание cron означает, что каждую минуту будет выполняться 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')
- и т.д.
Вы можете посмотреть все возможные команды в документации Laravel.
Кроме того, здесь можно запускать различные команды:
- Команды artisan
$schedule->command('emails:send Taylor --force')
- Задачи
$schedule->job(new Heartbeat)
- Команды оболочки
$schedule->exec('node /home/forge/script.js')
И это основы, которые вам нужно знать и понимать в планировании задач в Laravel. Все подробности и другие варианты есть в официальной документации.