S6 Studio

 

Автоматическая переиндексация сайта на 1С-Битрикс

Bitrix  Howto  • Евгений Задорин 23 апреля 2014 • Без комментариев

 

Недавно мне поставили довольно тривиальную задачу, связанную с модулем поиска 1С-Битрикс. Нужно было сделать регулярную автоматическую переиндексацию сайта, чтобы поисковая выдача была как можно более актуальной. Пошарив по документации и форумам, я быстро набросал нужный скрипт. Запуская его из браузера я получал отличный результат в виде качественно работающего поиска. Однако скрипт предназначался для использования в связке с cron, поэтому его требовалось запускать из командной строки.

После тестирования именно из командной строки, я убедился, что поиск стал работать хуже, качество поисковой выдачи ухудшилось, вплоть до того, что на запрос «электрочайник» возвращался пустой результат. Поиск в документации, к сожалению, не принес результатов, так что за поддержкой я обратился на форум разработчиков Битрикс, где меня навели на мысль, что возможно проблема кроется в настройках локали. И действительно, я заметил, что запросы, содержащие в себе только символы английского алфавита, прекрасно работают.

Благодаря все тому же форуму, удалось выявить причину странного поведения. Этой причиной оказался параметр mbstring.func_overload, который при запуске из консоли принимал значение 0, а при запуске из браузера — значение 2. Установка этого параметра в значение 2 в файле php.ini решила проблему, поиск стал работать адекватно.

Здесь я приведу финальную версию скрипта, который обеспечивает полную переиндексацию сайта в фоновом режиме. Надеюсь, эта информация кому-нибудь окажется полезной. Скрипт можно с легким сердцем вешать на cron, главное не забыть установить правильный DOCUMENT_ROOT, который, как известно, не определен при консольном запуске.


/**
 * Задать эти параметры через ini_set можно только в версиях php < 5.3
 * В последующих версиях придется настраивать php.ini
 */
ini_set('mbstring.func_overload', '2');
ini_set('mbstring.internal_encoding', 'UTF-8');


/**
 * Как правило, индексация длительный процесс, так что перестраховываемся
 */
set_time_limit(0);
ignore_user_abort(true);


/**
 * Явно задаем DOCUMENT_ROOT, т.к. запускать скрипт будем из консоли
 */
$_SERVER['DOCUMENT_ROOT'] = '/var/www';


/**
 * Устанавливаем константы. Не уверен, что нужны все, они тут на всякий случай скорее
 */
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS',true);
define('BX_CRONTAB', true);
define('BX_NO_ACCELERATOR_RESET', true);
define('SITE_ID', 's1');
define('LANG', 'ru');


/**
 * Подключаем пролог и модуль поиска
 */
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

if (!CModule::IncludeModule('search')) {
	die('Search module not included');
}


/**
 * Учет времени опционально
 */
$time_start = time();


/**
 * Инициализируем переменную, в которой будет прогресс процесса индексации
 */
$progress = array();


/**
 * Длительность шага индексации. Определена опытным путем.
 * Переиндексация происходит в полной мере, только если установить большое значение шага
 */
$max_execution_time = 10000;


/**
 * Основной цикл индексации.
 * Первый параметр true указывает, что должны переиндексироваться все элементы, 
 * а не только измененные
 */
while (is_array($progress)) {
	$progress = CSearch::ReIndexAll(true, $max_execution_time, $progress);
}


$total_time = time() - $time_start;

echo 'reindex finished. total time: ' . $total_time . ' seconds, indexed elements: ' . $progress . "\r\n";
 

 

<< К блогу Добавить комментарий

 

comments powered by Disqus

Самые популярные

К прочтению обязательно