Планирование задач
# Введение
Раньше разработчики настраивали через SSH крон на сервере для каждой новой задачи. Теперь Вы можете использовать плагины! Нужно указать лишь одну запись в кроне!
Примечание: См. [руководство по установке](../setup/installation#crontab-setup для настройки крона.
# Создание
Вы можете определить все запланированные задачи в методе registerSchedule
в классе регистрации плагина. Метод принимает один аргумент $schedule
.
Пример:
class Plugin extends PluginBase
{
[...]
public function registerSchedule($schedule)
{
$schedule->call(function () {
\Db::table('recent_users')->delete();
})->daily();
}
}
Вы также можете вызывать консольные команды по расписанию. Пример:
$schedule->command('cache:clear')->daily();
Используйте exec
для создания команд операционной системе:
$schedule->exec('node /home/acme/script.js')->daily();
# Параметры частоты выполнения
Метод | Описание |
---|---|
->cron('* * * * *'); | Выполнить задачу в произвольный момент времени |
->everyMinute(); | Выполнять задачу каждую минуту |
->everyFiveMinutes(); | Выполнять задачу каждые 5 минут |
->everyTenMinutes(); | Выполнять задачу каждые 10 минут |
->everyThirtyMinutes(); | Выполнять задачу каждые пол часа |
->hourly(); | Выполнять задачу каждый час |
->daily(); | Выполнять задачу каждый день в полночь |
->dailyAt('13:00'); | Выполнять задачу каждый день в 13:00 |
->twiceDaily(1, 13); | Выполнять задачу каждый день в 01:00 и 13:00 |
->weekly(); | Выполнять задачу каждую неделю |
->monthly(); | Выполнять задачу каждый месяц |
Эти методы могут сочетаться с дополнительными условиями для создания более тонкой настройки. Пример задачи, которая выполняется еженедельно в понедельник в 13:00:
$schedule->call(function () {
// Runs once a week on Monday at 13:00...
})->weekly()->mondays()->at('13:00');
Дополнительные условия:
Метод | Описание |
---|---|
->weekdays(); | в будние дни |
->sundays(); | по воскресеньям |
->mondays(); | по понедельникам |
->tuesdays(); | по вторникам |
->wednesdays(); | по средам |
->thursdays(); | по четвергам |
->fridays(); | по пятницам |
->saturdays(); | по субботам |
->when(Closure); | произвольное условие |
# Произвольное условие
Метод when
используется для ограничения выполнения задачи. Другими словами, если заданное Closure
возвращаетtrue
, задача будет выполняться до тех пор, пока не наступит другое условие:
$schedule->command('emails:send')->daily()->when(function () {
return true;
});
# Предотвращение перекрытия задач
По умолчанию запланированные задачи будут выполняться, даже если предыдущий экземпляр все еще запущен. Чтобы предотвратить это, Вы можете использовать метод withoutOverlapping
:
$schedule->command('emails:send')->withoutOverlapping();
# Вывод
Планировщик предоставляет несколько удобных методов для работы с результатами, которые генерируют задачами. Во-первых, используя метод sendOutputTo
, Вы можете отправить результат в файл для последующей проверки:
$schedule->command('emails:send')
->daily()
->sendOutputTo($filePath);
Вы также можете отправить результаты задачи на почту при помощи метода emailOutputTo
, но после того как запишите их в файл. Не забудьте настроить почтовый сервис:
$schedule->command('foo')
->daily()
->sendOutputTo($filePath)
->emailOutputTo('foo@example.com');
Примечание: Вы можете использовать методы
emailOutputTo
иsendOutputTo
только с методомcommand
!.
# Хуки
Используйте методы before
иafter
, чтобы указать код, который должен быть выполнен до или после завершения запланированной задачи:
$schedule->command('emails:send')
->daily()
->before(function () {
// Task is about to start...
})
->after(function () {
// Task is complete...
});
# Pinging URLs
Используйте методы pingBefore
иthenPing
, чтобы автоматически пинговать заданный URL до или после завершения задачи. Этот метод полезен для уведомления внешней службы о том, что запланированное задание начинается или завершается:
$schedule->command('emails:send')
->daily()
->pingBefore($url)
->thenPing($url);
Вы должны установить Drivers plugin (opens new window) перед тем как использовать
pingBefore($url)
илиthenPing($url)
.