Консольное обновление OSMap (CLI)

От 18 Май 2017. Опубликовано в Joomla

OSMap - компонент для создания карты сайта.

Всё хорошо, когда у вас небольшой сайт. Но что делать если на сайте сотни, тысячи страниц, и обновление карты сайта при обращении к ней не вариант?

OSMap предлагает один способ, это обращение к определенному URLу для обновления карты, причем обращение задействует веб-сервер, а это и нагрузка на него, и лимит во времени исполнения, и возможность оказать влияние на других пользователей. Например есть проект, где более 5000 страниц, при попытке такого обновления, даже если убрать ограничение на время исполнения в 30 секунд, то nginx'у становится очень не хорошо и сайт несколько минут выдает всем 5хх ошибку.

Самый удобный способ, это не трогать Apache/nginx и обратиться к скрипту напрямую, через PHP, использовать Command Line Interface (CLI) и ниже я предложу вариант такого скрипта.

Работоспособность проверена на:

PHP 7.1
Joomla 3.6.5
OSMap 4.2.3

Обязательно в конфигурации сайта (configuration.php) задайте переменную $live_site и укажите в ней адрес сайта со схемой, например https://site.ru

В папке cli/ с Joomla проектом создадим файл sitemap.php:

<?php
 
use Alledia\OSMapPluginCache;
 
const _JEXEC = 1;
 
error_reporting(E_ALL | E_NOTICE);
ini_set('display_errors', 1);
 
if (file_exists(dirname(__DIR__) . '/defines.php')) {
    require_once dirname(__DIR__) . '/defines.php';
}
 
if (!defined('_JDEFINES')) {
    define('JPATH_BASE', dirname(__DIR__));
    require_once JPATH_BASE . '/includes/defines.php';
}
 
require_once JPATH_LIBRARIES . '/import.legacy.php';
require_once JPATH_LIBRARIES . '/cms.php';
require_once JPATH_CONFIGURATION . '/configuration.php';
 
$config = new JConfig;
define('JDEBUG', $config->debug);
 
class SitemapConsole extends JApplicationCli
{
    const HTTP_HOST = 'site.ru';
 
    const ACTION_REFRESH = 'refresh';
    const ACTIONS = [
        self::ACTION_REFRESH,
    ];
 
    private $time = null;
 
    public function doExecute()
    {
        $this->outStart();
 
        $_SERVER['HTTP_HOST']   = self::HTTP_HOST;
        $_SERVER['REQUEST_URI'] = '/';
        JFactory::getApplication('site');
 
        set_time_limit(0);
 
        require_once JPATH_LIBRARIES . '/allediaframework/include.php';
        require_once JPATH_PLUGINS . '/osmap/cache/include.php';
 
        $action = $this->input->getString('action');
 
        if (!$action || $action == '1' || !in_array($action, self::ACTIONS)) {
            $this->out('Неизвестное действие');
            $this->outEnd();
            return;
        }
 
        switch ($action) {
            case self::ACTION_REFRESH:
                $this->actionRefresh();
                break;
        }
 
        $this->outEnd();
        return;
    }
 
    private function actionRefresh()
    {
        $id = $this->input->getInt('id');
 
        if (empty($id)) {
            $this->out('Необходимо задать идентификатор карты сайта');
            return;
        }
        $this->out('Запуск обновления карты сайта #' . $id);
 
        $cache = new OSMapPluginCache\Cache($id);
        $count = $cache->refresh();
 
        $this->out('Обновлено: ' . $count);
    }
 
    private function outStart()
    {
        $this->out('===========================================');
        $this->time = microtime(true);
    }
 
    private function outEnd()
    {
        $this->out('-------------------------------------------');
        $this->out(JText::sprintf('Общее время выполнения: %s секунд', round(microtime(true) - $this->time, 3)), true);
        $this->out('===========================================');
        $this->out();
    }
}
 
JApplicationCli::getInstance('SitemapConsole')->execute();

Обязательно измените константу SitemapConsole::HTTP_HOST.

Теперь можно выполнить запуск обновления карты сайта передав нужный идентификатор карты:

php /cli/sitemap.php --action=refresh --id=1

Добавить комментарий


Защитный код
Обновить