Консольные команды
У 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.