4.20. Планирование задач
- 1. Введение
- 2. Определение расписания задач
- 3. Запуск планировщика
- Task Output
- 5. Хуки задач
- 6. События
1. Введение
Ранее вы могли создавать записи конфигурации cron для каждой задачи, которую нужно было запланировать на вашем сервере. Однако это может стать неудобным, поскольку ваш график задач больше не находится в системе контроля версий, и вам нужно подключаться к серверу через SSH, чтобы просматривать существующие записи cron или добавлять новые.
Средство планировщика команд Laravel предлагает новый способ управления запланированными задачами на вашем сервере. С помощью планировщика вы можете легко и выразительно определить график команд прямо внутри вашего приложения Laravel. При использовании планировщика на сервере требуется только одна запись cron. Обычно график задач определяется в файле routes/console.php
вашего приложения.
2. Определение расписания задач
Вы можете определить все свои запланированные задачи в файле routes/console.php
вашего приложения. Для начала давайте рассмотрим пример. В этом примере мы запланируем выполнение замыкания каждый день в полночь. Внутри замыкания мы выполним запрос к базе данных для очистки таблицы:
<?php use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Schedule; Schedule::call(function () { DB::table('recent_users')->delete();})->daily();
Помимо планирования с использованием замыканий, вы также можете запланировать выполнение вызываемых объектов. Вызываемые объекты — это простые PHP классы, содержащие метод __invoke
:
Schedule::call(new DeleteRecentUsers)->daily();
Если вы предпочитаете оставить файл routes/console.php
только для определения команд, вы можете использовать метод withSchedule
в файле bootstrap/app.php
вашего приложения для определения запланированных задач. Этот метод принимает замыкание, которое получает экземпляр планировщика:
Если вы хотите просмотреть обзор ваших запланированных задач и время их следующего запуска, вы можете использовать команду Artisan schedule:list
:
php artisan schedule:list
2.1. Планирование Artisan команд
Помимо планирования замыканий, вы также можете планировать Artisan команды и системные команды. Например, вы можете использовать метод command
для планирования Artisan команды, указывая либо имя команды, либо её класс.
При планировании Artisan команд с использованием имени класса команды, вы можете передать массив дополнительных аргументов командной строки, которые должны быть переданы команде при её вызове:
use App\Console\Commands\SendEmailsCommand;use Illuminate\Support\Facades\Schedule; Schedule::command('emails:send Taylor --force')->daily(); Schedule::command(SendEmailsCommand::class, ['Taylor', '--force'])->daily();
2.1.1. Планирование Artisan команд с использованием замыканий
Если вы хотите запланировать Artisan команду, определенную с помощью замыкания, вы можете цепочечно вызывать методы, связанные с планированием, после определения команды:
Artisan::command('delete:recent-users', function () { DB::table('recent_users')->delete();})->purpose('Delete recent users')->daily();
Если вам нужно передать аргументы в команду замыкания, вы можете указать их в методе schedule
:
Artisan::command('emails:send {user} {--force}', function ($user) { // ...})->purpose('Send emails to the specified user')->schedule(['Taylor', '--force'])->daily();
2.2. Планирование выполнение очередей
Метод job
может быть использован для планирования заданий в очереди. Этот метод предоставляет удобный способ планирования заданий в очереди без необходимости использовать метод call
для определения замыканий, которые ставят задание в очередь:
use App\Jobs\Heartbeat;use Illuminate\Support\Facades\Schedule; Schedule::job(new Heartbeat)->everyFiveMinutes();
Опциональные второй и третий аргументы могут быть переданы методу job
, чтобы указать имя очереди и подключение к очереди, которые должны быть использованы для постановки задания в очередь:
use App\Jobs\Heartbeat;use Illuminate\Support\Facades\Schedule; // Dispatch the job to the "heartbeats" queue on the "sqs" connection...Schedule::job(new Heartbeat, 'heartbeats', 'sqs')->everyFiveMinutes();
3. Запуск планировщика
Теперь, когда мы узнали, как определить запланированные задачи, давайте обсудим, как их действительно запускать на сервере. Команда Artisan schedule:run
оценит все ваши запланированные задачи и определит, нужно ли их запускать, исходя из текущего времени на сервере.
Теперь, когда мы узнали, как определить запланированные задачи, давайте обсудим, как их действительно запускать на сервере. Команда Artisan schedule:run
оценит все ваши запланированные задачи и определит, нужно ли их запускать, исходя из текущего времени на сервере.
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
3.1. Запланированные задачи, рассчитанные на менее минуты
На большинстве операционных систем задачи cron ограничены запуском не более одного раза в минуту. Однако планировщик Laravel позволяет вам настраивать задачи для выполнения с более частыми интервалами, даже с интервалом в одну секунду:
use Illuminate\Support\Facades\Schedule; Schedule::call(function () { DB::table('recent_users')->delete();})->everySecond();
Когда задачи с интервалом менее минуты определены в вашем приложении, команда schedule:run
будет продолжать выполнение до конца текущей минуты, а не завершаться сразу. Это позволяет команде вызывать все необходимые задачи с интервалом менее минуты в течение всей минуты.
Поскольку задачи с интервалом менее минуты, выполнение которых занимает больше времени, чем ожидалось, могут задерживать выполнение последующих задач, рекомендуется, чтобы все такие задачи отправляли задания в очередь или использовали фоновую обработку команд для выполнения основной работы:
use App\Jobs\DeleteRecentUsers; Schedule::job(new DeleteRecentUsers)->everyTenSeconds(); Schedule::command('users:delete')->everyTenSeconds()->runInBackground();
5. Хуки задач
6. События
Laravel генерирует различные события в процессе планирования. Вы можете определить слушателей для любого из следующих событий:
Название события |
---|
Illuminate\Console\Events\ScheduledTaskStarting |
Illuminate\Console\Events\ScheduledTaskFinished |
Illuminate\Console\Events\ScheduledBackgroundTaskFinished |
Illuminate\Console\Events\ScheduledTaskSkipped |
Illuminate\Console\Events\ScheduledTaskFailed |