Если вам надоело постоянно нажимать кнопку “переиндексация” в админке, вам поможет данный скрипт, который можно повесить на cron.
Переиндексация сайта в 1С-Битрикс
Чтобы не загружать сайт в рабочее время, выполнять данную задачу будем ночью. Как повесить скрипт на крон вы можете найти в мануалах вашего хостера. В конце статьи дам вам рабочий пример как это сделать.
А пока что, перед нами стоит задача, каждый день в фоновом режиме выполнять переиндексацию сайта и инфоблоков.
Создайте файл и добавьте следующий код:
ini_set('mbstring.func_overload', '2'); // для версий php < 5.3 ini_set('mbstring.internal_encoding', 'UTF-8'); set_time_limit(0); ignore_user_abort(true); $_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; // все элементы индексируются только при большом шаге 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";
Важно! Обратите внимание на DOCUMENT_ROOT. Его нужно изменить. После чего, создайте задачу выполнять переиндексацию раз в сутки. Также, необходимо убедится, что скрипт дорабатывает до конца.
Зачем это нужно, спросите вы? Динамический поиск на сайте не всегда актуален, и может быть так что ваш товар или новость на сайте есть, но найти ее нельзя.
В версиях php > 5.3 нет возможности менять параметр mbstring.func_overload через ini_set(), поэтому пришлось ставить ее в настройках сервера. Но это уже вторично.
Чтобы повесить на крон вводим в консоле:
crontab -e
Команда откроет файл crontab для редактирования. И туда нужно добавить строчку примерно такого характера:
0 */24 * * * /usr/bin/php -f /var/www/search_reindex.php >/var/www/search_reindex.log
Это значит запускать файл search_reindex.php каждые 24 часа, результат записывать в файл search_reindex.log.
Абсолютные пути и названия файлов, естественно, прописываете свои.
UPDATE:
Еще один способ, состоит из 2 шагов.
Шаг 1. Помещаем скрипт для переиндексации в init.php:
function Reindex_Search()// переиндексация поиска { if(CModule::IncludeModule("search")) { $Result= false; $Result = CSearch::ReIndexAll(true, 60); while(is_array($Result)) { $Result = CSearch::ReIndexAll(true, 60, $Result); } } return "Reindex_Search();"; }
Шаг 2. Создаем агента для выполнения скрипта в CMS 1С-Битрикс:
Переходим на страницу Настройки > Инструменты > Агенты по команде Добавить агента на контекстной панели.
Самое важное добавить функция агента — это основное поле, имя функции, которую я написал в первом этапе это — Reindex_Search();
Функцию обязательно записывать в файл init.php, тогда корректная работа скрипта обеспечена.
спасибо за статью! Вопрос: класс CSearchStatistic не имеет магических методов и метода Reindex_Search(); Как он отработает?
https://dev.1c-bitrix.ru/api_help/search/classes/csearch/reindexall.php
скрин ошибочный, класс CSearchStatistic лишний.
спасибо, поправил