В этом руководстве мы рассмотрим использование планировщика задач Laravel для выполнения Cron заданий. Вы получите детальное представление о том, как создавать и запускать Cron задачи в Laravel 8. Использование планировщика задач избавляет владельца сайта от необходимости ручного выполнения многих рутинных операций - например, рассылки уведомлений и обновлений по почте.

Управлять заданиями с помощью планировщика Laravel также гораздо проще, чем заходить через SSH на сервер для добавления или изменения Cron записей. Рассмотрим шаг за шагом, как работать с планировщиком в Laravel 8.

Установка Laravel 8

Если фреймворк Laravel 8 у вас еще не установлен - запускайте приведенную ниже команду для инсталляции и создания нового проекта:

composer create-project --prefer-dist laravel/laravel blog

Создание новой команды

Теперь мы создадим новую пользовательскую команду, которая будет исполнять Cron задачи планировщика. Выполните следующую команду:

php artisan make:command DemoCron --command=demo:cron

Теперь отредактируем командный файл – он называется DemoCron.php и располагается здесь - app/Console/Commands/DemoCron.php. Внесите в него следующий код:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class DemoCron extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'demo:cron';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        Log::info('Cron is working fine!');
    }
}

Настройка расписания планировщика

Для автоматического выполнения запланированных задач в определенное время необходимо внести соответствующие настройки в файл Kernel.php. Примеры настроек:

  • ->everyMinute(); Запуск задания каждую минуту
  • ->everyFiveMinutes(); Запуск каждые пять минут
  • ->everyTenMinutes(); Исполнение задачи каждые 10 минут
  • ->everyFifteenMinutes(); Запуск задачи раз в 15 минут
  • ->everyThirtyMinutes(); Исполнение задания каждые 30 минут
  • ->hourly(); Запуск задачи каждый час
  • ->hourlyAt(17); Выполнение задания каждый час на 17-й минуте
  • ->daily(); Исполнение задачи ежедневно в полночь
  • ->dailyAt('13:00'); Выполнение задания каждый день в 13:00
  • ->twiceDaily(1, 13); Запуск задачи каждый день в 1:00 и в 13:00
  • ->weekly(); Исполнение задачи раз в неделю
  • ->weeklyOn(1, '8:00'); Запуск задачи каждую неделю во вторник в 8:00
  • ->monthly(); Исполнение задачи раз в месяц
  • ->monthlyOn(4, '15:00'); Запуск задачи каждый месяц, 4-го числа в 15:00
  • ->quarterly(); Запуск задания раз в квартал
  • ->yearly(); Исполнение задачи раз в год
  • ->timezone('America/New_York'); Установка временной зоны

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

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        Commands\DemoCron::class,
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')->hourly();
        $schedule->command('demo:cron')->everyMinute();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

Тестовый запуск планировщика

Теперь мы готовы запустить планировщик Cron задач. Для этого выполните следующую команду:

php artisan schedule:run

После выполнения данной команды откройте лог-файл приложения, он располагается по адресу - storage/logs/laravel.log. В нем должен быть представлен отчет, похожий на этот:

[2021-08-20 06:52:23] local.INFO: Cron is working fine!  

Если все в порядке, можно добавлять задание в файл crontab планировщика задач, размещенного на сервере. Для этого воспользуйтесь любой из приведенных ниже строк:

* * * * * php /path/to/artisan schedule:run 1 >> /dev/null 2>&1

или 

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