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