Запуск задач по расписанию или интервал времени в Laravel 5.1
Доброго времени суток. В данной статье я хочу рассказать как с помощью Schedule можно запускать скрипты через определенный период времени или по расписанию. Для этого мы создадим скрипт, который запускается из консоли через artisan. Задача скрипта записывать в файл логов одну строчку. Т.е. в данной статье мы познакомимся с основами создания artisan команды в Laravel (Artisan Console), познакомимся как добавлять запись в лог-файл Laravel и разберемся с Task Scheduling Laravel.
Первое, что нам надо создать скрипт.
Создание скрипта.
Переходим в корень нашего сайта и запускаем следующую команду
php ./artisan make:console Demo
Замечание: У меня ОС — Linux, команда для запуска artisan в Windows и MacOS может отличаться. Но параметры, которые передаются команде artisan одинаковые.
Данная команда создает класс Demo, который наследуется от Command. Сам файл с классом Demo находится в app/Console/Commands
Редактируем наш файл следующим образом:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class Demo extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'demo'; /** * The console command description. * * @var string */ protected $description = 'demo Scheduler'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { \Log::info('Test - '.\Carbon\Carbon::now()); } }
Давайте рассмотрим чуть подробнее данный файл.
Свойство:
protected $signature = 'demo';
Определяет имя команды, при помощи которого мы будем её вызывать.
Свойство:
protected $description = 'demo Scheduler';
Определяет описание команды, которое мы видим при вызове artisan без параметров.
Метод:
public function handle()
Это основной метод, который реализует логику нашей команды.
В данный метод добавим следующий код:
\Log::info('Test - '.\Carbon\Carbon::now());
Который в лог файл Laravel добавляет строку «Test — <текущую дату>»
Осталось зарегистрировать нашу команду. Для этого откроем файл Kernel.php, который находится в /app/Console. И добавим в свойство $commands:
\App\Console\Commands\Demo::class,
Должно получится:
protected $commands = [ \App\Console\Commands\Inspire::class, \App\Console\Commands\Demo::class, ];
Более подробно о создании artisan команд в Laravel Вы можете почитать в официальной документации.
Проверим, запускаем команду
./artiasan demo
Смотрим файл логов. Вот, что он мне записал
[2015-07-15 05:52:57] local.INFO: Test - 2015-07-15 05:52:57
Отлично работает. Теперь добавим нашу команду в Schedule.
Добавление команды в Schedule Laravel.
Первое, что нам нужно сделать – это добавить строку
* * * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1
в cron.
В Ubuntu это делается просто, запускаем
crontab -e
И вставляем нашу строку.
Дальше открываем файл Kernel.php, который расположен в /app/Console. И в метод schedule добавляем следующую строку:
$schedule->command('demo') ->everyMinute();
Вот, что должно получится:
protected function schedule(Schedule $schedule) { $schedule->command('inspire') ->hourly(); $schedule->command('demo') ->everyMinute(); }
Что означает запускать команду demo каждую минуту. Более подробно о schedule в Laravel Вы можете познакомиться в официальной документации. Сохраняем и проверяем.
Вот вывод моего лога:
[2015-07-15 06:05:01] local.INFO: Test - 2015-07-15 06:05:01 [2015-07-15 06:06:01] local.INFO: Test - 2015-07-15 06:06:01 [2015-07-15 06:07:01] local.INFO: Test - 2015-07-15 06:07:01 [2015-07-15 06:08:01] local.INFO: Test - 2015-07-15 06:08:01
Как видим все работает.
Заключение.
В данной статье мы создали команду artisan. В которой использовали метод записи информационного сообщения в лог файл Laravel, использовали Carbon для работы с датой. И поместили команду в график запуска (в нашем случае каждую минуту). Как видите все очень просто.
Вот и все!
->everyMinute() — не работает. Выдает ошибку, что функция не определена.
$schedule->command(‘demo’); — так работает.
Если задача запускается один раз в минуту, как и срабатывает системный крон, то и нет необходимости в ->everyMinute(). Может разработчик Laravel именно так и подумал)
Нет, ->everyMinute(); определена посмотрите официальную документацию http://laravel.com/docs/5.1/scheduling#schedule-frequency-options