Запуск задач по расписанию или интервал времени в Laravel 5.1

Ромчик
2

laravel

Доброго времени суток. В данной статье я хочу рассказать как с помощью 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 для работы с датой. И поместили команду в график запуска (в нашем случае каждую минуту). Как видите все очень просто.

Вот и все!

Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger

  • Александр - 31.10.2015 в 12:59

    ->everyMinute() — не работает. Выдает ошибку, что функция не определена.
    $schedule->command(‘demo’); — так работает.
    Если задача запускается один раз в минуту, как и срабатывает системный крон, то и нет необходимости в ->everyMinute(). Может разработчик Laravel именно так и подумал)

  • Ромчик - 31.10.2015 в 14:34

    Нет, ->everyMinute(); определена посмотрите официальную документацию http://laravel.com/docs/5.1/scheduling#schedule-frequency-options

  • ©2012-2020 По всем вопросам обращайтесь через форму обратной связиПолитика конфиденциальности

    Яндекс.Метрика