Перейти к содержимому


Фотография
- - - - -

Как запустить JBZoo из консоли ?

рецепт console консоль

Сообщений в теме: 10

#1 SmetDenis

SmetDenis

Отправлено 09 June 2015 - 16:51

Время от времени возникают вопросы, как запустить JBZoo в консоли и что-то выполнить.
Например, переиндексацию после собственного скрипта импорта.
 
Начиная с JBZoo v2.2.0 RC #2 rev2745 я добавил несколько условий в код, чтобы можно было c минимумом запускать наш код из консоли. 

Когда это полезно?
  • если хочется выполнять какую-то операцию периодично или не руками.
  • если эта операция занимает какое-то продолжительное время (например 5 минут). Т.е через браузер это все упадет из-за недостатка времени, памяти.
НО есть несколько НО
  • Изначально оригинальный компонент Zoo не был рассчитан на запуск из консоли. Возможно в старых версиях придется добавить хаки.
  • Делаем выводы из первого пункта, поэтому запускаем код в консоли так, как будто-то это вход браузера (эмулируем)
  • Это эмуляция браузера, Поэтому у нас нету куков и сессии. Значит мы не попадем в контроллеры панели управления (да и не сильно нужно).
  • Скорее всего некоторые расширения Joomla написаны как попало, поэтому они могут выдать ошибки, даже фатальные. Сюда будут относится в основном плагины.
Пример кода для запуска
<?php

// We are a valid entry point.
define('_JEXEC', 1);
define('JDEBUG', 0); // debug mode
define('JPATH_BASE', __DIR__); // website root directory

// include Joomla framework
require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_LIBRARIES . '/import.legacy.php';
require_once JPATH_LIBRARIES . '/cms.php';

// hide NOT important errors (without NOTICE)
error_reporting(E_ERROR | E_WARNING | E_PARSE);
ini_set('display_errors', 1);

// max time 1800 seconds = 30 min
// max memory limit = 256 Mb
@ini_set('memory_limit', '256M');
@ini_set('max_execution_time', 1800);
if (function_exists('set_time_limit')) {
    @set_time_limit(1800);
}

/**
 * Class JBZooCli
 */
class JBZooCli extends JApplicationCli
{
    /**
     * Entry point for CLI script
     */
    public function doExecute()
    {
        // Joomla environment hacks
        $_SERVER['HTTP_HOST'] = 'console.example.com';
        $_SERVER['REQUEST_METHOD'] = 'GET';
        $_GET['tmpl'] = $_REQUEST['tmpl'] = 'raw';

        // init Joomla App ( Front-end emulation ).
        JFactory::getApplication('site');

        // init important vars AND compatibility with old Joomla and some old extensions
        !defined('JBZOO_APP_GROUP') && define('JBZOO_APP_GROUP', 'jbuniversal');
        !defined('DIRECTORY_SEPERATOR') && define('DIRECTORY_SEPERATOR', '/');
        !defined('DS') && define('DS', DIRECTORY_SEPARATOR);

        // include Zoo + JBZoo frameworks
        require_once JPATH_BASE . '/administrator/components/com_zoo/config.php';
        require_once JPATH_BASE . '/media/zoo/applications/jbuniversal/framework/jbzoo.php';

        // init JBZoo
        JBZoo::init();

        // ----- START my script
        $this->_reindexAll();
        $this->_myAction();
        // ----- FINISH my script

        jexit('ok!');
    }

    /**
     * Reindex all JBZoo database
     */
    protected function _reindexAll()
    {
        // set step size
        $indexStep = 10;

        // init vars
        $offset = $totalLines = 0;
        $reIndex = -1;
        $indexModel = JBModelSearchindex::model();

        while ($reIndex != 0) {
            $reIndex = $indexModel->reIndex($indexStep, $offset);
            $offset += $indexStep;
            $totalLines += $reIndex;
        }

        // show result
        $this->out('Total reIndexed lines = ' . $totalLines);
    }

    /**
     * Some another function
     */
    protected function _myAction()
    {
        // my custom function
    }

}

// execute all !
JApplicationCli::getInstance('JBZooCli')->execute();
На что стоит обратить внимание ?
  • Приглядитесь, в начале скрипта устанавливаются HTTP_HOST, REQUEST_METHOD и tmpl. Это нужно чтобы Joomla думала что её запустил браузер (по факту apache/nginx)
  • Установите подходящие memory_limit и max_execution_time.
  • Приложение Joomla создается вида 'site' (а по идее должен быть 'cli'), но он не работает из-за тонны багов в Zoo (он не умеет из консоли)
  • Мы специально скрываем все NOTICE ошибки, т.к предположительно их будет много в кривонаписанных расширениях
  • Константа JPATH_BASE должна ссылаться на корень сайта. В моем примере скрипт консоли лежит в корне сайта. поэтому там __DIR__. Можно написать вручную но от корня файловой системы.
  • НЕ НУЖНО СТАВИТЬ бесконечный лимит по времени. Если скрпит повиснет, то хостинг будет тормозить, а хостер будет не доволен.
  • НЕ ИСПОЛЬЗУЙТЕ массив $_SERVER напрямую, лучше API Joomla и константы
  • РЕКОМЕНДУЮ поставить в HTTP_HOST домен вашего сайта, чтобы избежать проблем с кешем Joomla и кривыми расширениями.
  • У скрипта должно быть право на запуск (+x) - http://joomla-book.r...s-or-777-is-bad
Как запустить?
Под windows делаем так
C:\Users\user>полный_путь_php.exe полный путь php файла
У меня это выглядит так
C:\Users\smdenis>d:\web-server\modules\php\PHP-5.4\php.exe d:\web-server\domains\jbzoo\demo\public_html\jbzoo-console.php
Total reIndexed lines = 43
ok!
C:\Users\smdenis>
Под линукс все точно так же, только вместо "пути_к_php.exe" пишем просто "php" или что-о вроде "/usr/bin/php"
php /home/site.com/jbzoo-console.php
Задача для linux cron.
Кстати, гуглится очень просто, есть даже виджеты. Советую начать с вики - https://ru.wikipedia.org/wiki/Cron+ http://cron.nmonitor...-generator.html
Это пример на запуск раз в час.
0 * * * * php /home/site.com/jbzoo-console.php

Результат
Если что-то пошло не так, то мы увидим ошибки. Например вот как Joomla ругается если НЕ указать домен.
29bg_200x0.png

Если все нормально, то картина проще. Вывелась статистика индекса. У меня в каталоге очень мало материалов, так что всего 43 записи в базе для фильтра.
z61d_200x0.png

 
Проверял на
Joomla: 3.4.1
JBZoo: 2.2.0 Pro (RC #2 rev2745)
Zoo: 3.3.4

Если вам нужно запускать что-то написанное для Joomla но без Zoo, то посмотрите пример
/cli/deletefiles.php Вся суть та же...
  • 3
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#2 axeld

axeld

Отправлено 27 June 2016 - 15:02

Путаюсь проделать тоже самое. Сначала выдавал ошибку (Запуск программы невозможен, так как на компьютере отсутствует CORE_RL_wand_.dll. Попробуйте переустановить программу)

В php.ini закомментировал строку ;extension=php_imagick.dll (прочитал на форуме http://open-server.r...opic.php?t=145)

теперь другая проблема.

 

Прикрепленные изображения

  • openserver.jpg

  • 0

#3 SmetDenis

SmetDenis

Отправлено 28 June 2016 - 04:04

Добавьте путь к директории с PHP в системную переменную PATH (через точку с запятой, старое значение НЕ удалять), тогда у вас в консоли будет доступна команда

php -v

nnla_200x0.png

 

t65a_200x0.png

 

Возможно потребуется перезагрузка.


  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#4 axeld

axeld

Отправлено 28 June 2016 - 08:36

Вроде сделал, все как вы написали. Перезагружал комп. два раза, ставил в конце пути к переменной ; и без неё. Все тоже самое. 

Прикрепленные изображения

  • openserver2.jpg

  • 0

#5 Cheren-dow

Cheren-dow

Отправлено 28 June 2016 - 09:01

axeld, нужно указать путь до папки где лежит php.exe  у меня например это:

D:\OpenServer\modules\php\PHP-5.6

Далее в консоли уже без полного адреса можно просто писать php. Перед эти проверьте что у вас php работает выполнив команду 

php -v

  • 0
Изображение
 

#6 SmetDenis

SmetDenis

Отправлено 28 June 2016 - 09:03

Нужно указывать путь до папки, где лежат exe файлы, а не сам файл.

Эффект должен быть виден таким образом.

echo %PATH%
 
Вообще прописывать пути - это тривиальная задача, думаю есть масса мануалов в интернете.

 

Так же рекомендую использовать свежую версию PHP и JBZoo-Cli из нашего гитхаба (он удобнее)


  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#7 axeld

axeld

Отправлено 28 June 2016 - 09:20

Нужно указывать путь до папки, где лежат exe файлы, а не сам файл.

Эффект должен быть виден таким образом.

echo %PATH%
 
Вообще прописывать пути - это тривиальная задача, думаю есть масса мануалов в интернете.

 

Так же рекомендую использовать свежую версию PHP и JBZoo-Cli из нашего гитхаба (он удобнее)

 

Ошибку я понял, но как то все равно не работает. Может это из-за php5.4 ?


Попробовал на "живом" сервере. там подключается без проблем, то как то не выполняется.

Прикрепленные изображения

  • openserver4.jpg
  • openserver3.jpg

  • 0

#8 SmetDenis

SmetDenis

Отправлено 28 June 2016 - 09:23

Версия 5.6 намного лучше. Почему бы не использовать современный софт?


  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#9 axeld

axeld

Отправлено 28 June 2016 - 10:52

Получилось с php5.6 сразу!

Правда, как я понял, переиндексации не состоялось, но все равно круто. :))

 

Прикрепленные изображения

  • openserver5.jpg

  • 0

#10 SmetDenis

SmetDenis

Отправлено 28 June 2016 - 12:08

Лучше использовать это - http://jbzoo.ru/blog...-import-by-cron

 

Там есть импорт, экспорт, переиндексация и легко написать свою консольную команду


  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.






Темы с аналогичным тегами рецепт, console, консоль

Click to return to top of page in style!