Класс Schedule
Класс Schedule используется для определения запланированных задач в приложении Laravel. Он доступен через фасад Schedule или внедрение зависимости в консольном ядре. Класс предоставляет методы для регистрации Artisan-команд, вызовов замыканий и запуска очередей с указанием периодичности выполнения. Все задачи определяются в методе schedule класса AppConsoleKernel.
Базовое использование
Для создания запланированной задачи используется метод command, который принимает имя Artisan-команды:
<?php
namespace AppConsole;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('cache:clear')->daily();
}
}
?>
Метод command
Метод command используется для регистрации Artisan-команды в расписании. Первым параметром передаётся имя команды, вторым необязательным - массив аргументов:
<?php
namespace AppConsole;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('mail:send', ['--force'])->daily();
}
}
?>
Метод call
Метод call позволяет выполнять произвольное замыкание по расписанию:
<?php
namespace AppConsole;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
use IlluminateSupportFacadesLog;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
Log::info('Scheduled task executed');
})->hourly();
}
}
?>
Метод job
Метод job используется для постановки задания очереди по расписанию:
<?php
namespace AppConsole;
use AppJobsProcessPendingOrders;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->job(new ProcessPendingOrders)->everyFiveMinutes();
}
}
?>
Периодичность выполнения
Класс Schedule предоставляет множество методов для настройки частоты выполнения задач. Рассмотрим основные из них:
<?php
namespace AppConsole;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('backup:run')->everyMinute();
$schedule->command('reports:generate')->daily();
$schedule->command('queue:prune')->weekly();
$schedule->command('logs:clean')->monthly();
}
}
?>
Пример с cron-выражением
Для гибкой настройки расписания можно использовать метод cron с произвольным cron-выражением:
<?php
namespace AppConsole;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('analytics:collect')->cron('0 */3 * * *');
}
}
?>
Ограничение перекрытия
Метод withoutOverlapping предотвращает запуск задачи, если предыдущий экземпляр всё ещё выполняется:
<?php
namespace AppConsole;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('import:data')
->everyMinute()
->withoutOverlapping();
}
}
?>
Условия выполнения
Метод environments позволяет ограничить выполнение задачи определённой средой:
<?php
namespace AppConsole;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('db:seed')
->daily()
->environments('local', 'staging');
}
}
?>
Запуск расписания
Для выполнения запланированных задач используется команда schedule:run. Её следует добавить в системный cron с периодичностью каждую минуту:
"* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1"
Полный пример
Давайте рассмотрим полный пример консольного ядра с несколькими запланированными задачами:
<?php
namespace AppConsole;
use AppJobsCleanupTempFiles;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
use IlluminateSupportFacadesLog;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('backup:database')
->daily()
->environments('production');
$schedule->call(function () {
$users = User::where('active', false)->delete();
Log::info('Inactive users deleted');
})->weekly();
$schedule->job(new CleanupTempFiles)
->hourly()
->withoutOverlapping();
$schedule->command('reports:generate')
->cron('0 2 * * 1')
->timezone('Europe/Moscow');
}
}
?>
Смотрите также
-
класс
Command,
который используется для создания пользовательских команд -
метод
handle,
который содержит логику выполнения команды -
команда
schedule:run,
которая запускает все запланированные задачи -
команда
schedule:list,
которая показывает все зарегистрированные задачи