Меню

Console Jedi

https://github.com/notamedia/console-jedi

Основные преимущества

  • подключается через composer
  • идеальная основа для интеграции Битрикса в CI
  • легко расширяет возможности Ваших модулей, добавляя им CLI-интерфейсы
  • имеет команды-примеры:
    • переключение агентов на крон
    • ручной запуск агента
    • очистка кэша Битрикс
    • иницализация площадки разработчика (копирование файлов, прописывание лицензионного ключа, файла .settings.php, конфигурации и т.п.)

Модуль разработан для того, чтобы полноценно подключить Битрикс к системе Continuous Integration. Он позволяет делать типовые операции по управлению площадкой не выходя из консоли и/или с помощью автоматизированных систем.

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

Кто использует

Решение используется в нескольких проектах Notamedia, а также используется как основа для других решений компании.

Этот модуль являтся результатом более чем двухлетнего исследования и опыта по интеграции Битрикса и консоли.

Как начать работу

Допустим, Вы хотите автоматически очищать кэш Битрикса после выкатки проекта вашим CI (так делать, конечно, нельзя, но мы рассмотрим этот заведомо ложный пример для иллюстрации).

  1. Установите composer, если Вы ещё не сделали этого.
    Как это правильно сделать в 1С-Битрикс читайте в статье.

  2. Подключите зависимость "notamedia/console-jedi" и укажите версию.
    Старайтесь не использовать неявное указание версии через "*", если Вы занимаетесь коммерческой разработкой. Следуйте принципам семантического версионирования или фиксируйте версию явно.

  3. Запустите установщик в консольном режиме: ./vendor/bin/jedi init и ответьте ему в интерактивном режиме на вопросы. Это разовая операция, с помощью которой генерируется файл jedi, используемый для запуска консольных команд.

  4. Запустите команду ./vendor/bin/jedi bitrix/cache:clear

  5. Вы великолепны!

Для исследования других консольных команд запустите jedi, он сам расскажет все подробности.

Примечание: консольные команды следует выполнять от того же Linux-пользователя, от имени которого работает Ваш веб-сервер. Никогда не запускайте консольные команды от имени пользователя root! В противном случае могут быть созданы файлы, с которыми веб-сервер не сможет работать.

Как создать свой модуль на базе Console Jedi

Допустим, Вы хотите добавить свои команды. Например, Вам нужна команда, которая будет синхронизировать данные Вашего сайта со сторонней системой. Запускать подобные синхронизации через веб-интерфейс - решение очевидное, но опасное: “тяжёлые” процессы могут “отваливаться” по таймауту, их нельзя будет прервать (и при плохо настроенном веб-сервере они будут “подвешивать” работу всего сайта), случайный пользователь или злоумышленник может воспользоваться вашей “специальной ссылкой для синхронизации” и запустить процесс без вашего ведома. Консольные команды решают эти, и некоторые другие проблемы на корню.

Итак, мы будем создавать модуль mycompany.synchWithCrm, который должен содержать консольные команды.

  1. Создайте “болванку” модуля
    Её можно создать, руководствуясь документацией 1С-Битрикс, или готовым решением-заготовкой, одним из многих, выложенных на гитхабе.
    Предположим, что модуль будет находится в папке
    /local/modules/mycompany.synchwithcrm/

  2. В модуле создайте файл cli.php: /local/modules/mycompany.synchwithcrm/cli.php
    В этом файле Вы пропишете список команд, например
    <?php
    return [
    'commands' => [
    new \Mycompany\Synchwithcrm\Console\DoSynchCommand(),
    ]
    ];

    где каждая каждая такая команда - это объект класса, расширяющего класс Notamedia\ConsoleJedi\Command\BitrixCommand. Пример такой команды Вы можете посмотреть в console-jedi/src/Command/Agents/OnCronCommand.php.

  3. Создайте класс \Mycompany\Synchwithcrm\Console\DoSynchCommand, упомянутый на прошлом шаге
    Кроме правильного наследования, Вам нужно будет прописать у него два метода: configure() и execute(InputInterface $input, OutputInterface $output).
    Сейчас в методе execute(..) пропишите просто echo "Hello world";, чтобы убедиться, что система работает.

  4. Запустите jedi и в списке команд Вы увидите свою созданную команду
    Теперь в известном Вам методе можно прописать “тяжёлую” логику по синхронизации данных, не разбивая её на итерации.
    Прописав запуск этой операции на cron или запуская её по какому-то необходимому событию, мы получаем желаемый результат.