Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Консольные команды

У Joomla есть консольная программа — файл cli/joomla.php. Через неё сайт обслуживают без браузера: обновляют, чистят кеш, создают пользователей. Свои команды добавляют плагином группы console — удобно для импорта данных и задач по расписанию.

Встроенные команды

Команды запускают из корневой папки сайта:

php cli/joomla.php list

Команда list печатает все доступные команды с описаниями.

КомандаЧто делает
cache:cleanОчищает кеш
extension:listСписок установленных расширений
extension:install --path=/tmp/mod_hello.zipУстанавливает расширение из архива
extension:discover:installУстанавливает расширения, найденные поиском
user:addСоздаёт пользователя
core:updateОбновляет Joomla
site:down, site:upЗакрывает и открывает сайт

Файлы своей команды

Создайте вручную плагин группы console:

plugins/console/hello/
├── hello.xml
├── services/provider.php
└── src/
    ├── Command/
    │   └── CountCommand.php         сама команда
    └── Extension/
        └── Hello.php                плагин: регистрирует команду

Манифест и провайдер — как у плагина content: группа console, имя plg_console_hello, пространство имён My\Plugin\Console\Hello.

Класс команды

// plugins/console/hello/src/Command/CountCommand.php
namespace My\Plugin\Console\Hello\Command;
 
defined('_JEXEC') or die;
 
use Joomla\Console\Command\AbstractCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
 
class CountCommand extends AbstractCommand
{
    protected static $defaultName = 'hello:count';
 
    protected function configure(): void
    {
        $this->setDescription('Показывает число записей блога');
    }
 
    protected function doExecute(InputInterface $input, OutputInterface $output): int
    {
        $io = new SymfonyStyle($input, $output);
 
        $io->success('Команда работает');
 
        return 0;
    }
}

$defaultName — имя команды. Метод doExecute() выполняет работу и возвращает код завершения: 0 означает успех.

Регистрация в плагине

// plugins/console/hello/src/Extension/Hello.php
namespace My\Plugin\Console\Hello\Extension;
 
defined('_JEXEC') or die;
 
use Joomla\Application\ApplicationEvents;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\SubscriberInterface;
use My\Plugin\Console\Hello\Command\CountCommand;
 
final class Hello extends CMSPlugin implements SubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            ApplicationEvents::BEFORE_EXECUTE => 'registerCommands',
        ];
    }
 
    public function registerCommands(): void
    {
        $this->getApplication()->addCommand(new CountCommand());
    }
}

Событие BEFORE_EXECUTE происходит перед выполнением любой консольной команды — в этот момент плагин добавляет в приложение свою.

Запуск

Установите плагин через «Поиск», включите его и выполните:

php cli/joomla.php hello:count

В терминале появится зелёная строка [OK] Команда работает. Команда видна и в выводе list.

Работа с базой

Теперь команда может делать настоящую работу. Замените тело doExecute():

// plugins/console/hello/src/Command/CountCommand.php
use Joomla\CMS\Factory;
use Joomla\Database\DatabaseInterface;
 
protected function doExecute(InputInterface $input, OutputInterface $output): int
{
    $db = Factory::getContainer()->get(DatabaseInterface::class);
 
    $query = $db->getQuery(true)
        ->select('COUNT(*)')
        ->from($db->quoteName('#__hello_posts'));
 
    $total = (int) $db->setQuery($query)->loadResult();
 
    (new SymfonyStyle($input, $output))->success('Записей в блоге: ' . $total);
 
    return 0;
}

Команда печатает [OK] Записей в блоге: 2.

Запуск по расписанию

Любую команду можно запускать системным планировщиком cron. Например, встроенный планировщик задач Joomla («Система → Запланированные задачи») надёжнее вызывать так, а не ждать посетителей сайта:

*/5 * * * * php /var/www/site/cli/joomla.php scheduler:run

Строка запускает ожидающие задачи каждые пять минут.

Частая ошибка

Команду запускают другой версией PHP, чем та, на которой работает сайт: на хостинге команда php в консоли часто указывает на старую версию. Joomla в ответ сообщает о неподходящей версии или о недостающих модулях. Проверьте php -v и при необходимости укажите полный путь к нужному исполняемому файлу PHP.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.