Как стать автором
Обновить

Управляем командами на Laravel

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров5.3K

Chronos for Laravel

Сегодня я расскажу о небольшом пет-проекте. Реализован он был для собственных нужд и с целью более гибкого управления выполнением команд.

На Laravel имеется хорошая база для управления cli-командами. Когда мы создаем команду (php artisan make:command Test) и реализуем ее, то после этого можем настроить плановое выполнение в файле kernel.php. Пример подобной настройки:

$schedule
  ->command(Test::class)
  ->everyMinute(); # выполнять каждую минуту

Так мы говорим фреймворку, чтобы планировщик запускал команду каждую минуту. Установили время выполнения, залили изменения в GIT, произвели деплой на dev, протестировали и залили в production. Все работает хорошо, задача выполняется. И тут у нас возникает необходимость временно отключить выполнение этой команды. Причины могут быть разные:

  1. Сервис, использующийся в команде, в некоторых случаях выполняется с ошибкой.

  2. Перестал отвечать интегратор и валятся ошибки.

  3. Необходимо переработать бизнес-логику и текущая пока не должна работать.

Возможны 3 варианта отключения работы команды:

  1. Если команда только одна, то можно отключить планировщик в кроне.

  2. Если не критично, то можно закомментировать или удалить запись в kernel.php на проде.

  3. Можно выполнить изменения пункта 2 и залить изменения в GIT и задеплоить.

Действие отключения команды вроде легкое, а имеются уже несколько нюансов. Идем дальше. Вот мы реализовали несколько команд с разным аптаймом выполнения. Одна выполняется несколько секунд, другая несколько минут, еще одна гораздо больше времени. Но все они выполняются последовательно. Проблема здесь в маленькой команде, которая должна выполняться каждую минуту. Точнее не в ней самой, а в том, что она не может быть запущена, потому что планировщик ожидает выполнения всех команд и пока все не выполнятся не запустится следующий цикл. Решаем проблему добавив к нашей маленькой команде метод, который отправит ее выполнение в фоновый режим (параллельное выполнение):

$schedule
  ->command(Test::class)
  ->everyMinute()
  ->runInBackground(); # отправка в фон

Также можно сделать и для других команд. И здесь возникает следующая проблема дублирования запусков. Например, есть команда, которая должна запускаться каждую минуту и выполняется 10 минут. В таком случае, каждую минуту она будет запущена и параллельно будут выполняться несколько ее копий. Чтобы это избежать и запускать только один экземпляр существует специальный метод:

$schedule
  ->command(Test::class)
  ->everyMinute()
  ->runInBackground()
  ->withoutOverlapping(); # выполняется 1 экземпляр команды параллельно

Есть и другие настройки, которые могут понадобиться для выполнения команд, в том числе и аргументы и опции самой команды. Также у одной команды может быть несколько периодов выполнения, в том числе с разными настройками.

Трудность заключается в частом выполнении этих действий, иногда приходится отключать или включать команды или изменять их параметры запусков. Иногда эти действия длительные, потому что затрагивают полный цикл развертывания приложения. Для решения этой задаче реализован пакет Chronos for Laravel. Он реализует веб-интерфейс для удобного взаимодействия с такими настройками без необходимости каждый раз лезть в код проекта.

Устанавливаем в свой проект:

composer require tkachikov/chronos

Запускаем инсталятор:

php artisan chronos:install

Накатываем миграции:

php artisan migrate

После этого (чтобы избежать ошибок) заходить на главную страницу:

localhost:8000/chronos

Если проект пустой и в нем нет еще команд, то на главной странице будут отображены только команды Chronos. Для тестирования работы пакета можно воспользоваться командой Test. Переход на карточку команды выполняется по ссылке на сигнатуре.

У команды есть зеленая кнопка, которая запустит ее выполнение в real-time. После выполнения, появятся логи. Здесь же имеются параметры для создания планировщика команды.

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

Спасибо за внимание!

Репозиторий

Теги:
Хабы:
Всего голосов 21: ↑21 и ↓0+21
Комментарии6

Публикации

Истории

Работа

PHP программист
111 вакансий

Ближайшие события

19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн