Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Автоматическое индексирование контента Битрикс-сайтов в ночное время:

00 голосов
8
Здравствйте!

Предистория - в свое время наш бывший Веб-программист (а я пока только начинающий/новичок в этом деле smile:) уже как бы решил эту задачу, но спустя некоторое время его скрипт перестал работать smile:(

ИТАК ЗАДАЧА: Обеспечить ночью (желательно с промежуток с 0 до 3.59; т.к. остальные промежутки заняты ДРУГИМИ важными процессами) ПОЛНОЕ автоматическое (скрипт на кроне) переиндексирование всего измененного контента на Битрикс-сайте. Что аналогично если бы мы в ручную зашли: Админка - Настройки - Переиндексация (/bitrix/admin/search_reindex.php?lang=ru) и выставили бы:
- Переиндексировать только измененные:
- Индексировать по шагам: Шаг: 20 секунд
- Сайт: (все)
- Модуль: (все)
И нажали "Переиндексировать" (если делать это вручную ТО процесс как правило занимает не более 15-20 минут - поэтому 2 - 4-х часов ночью должно быть более чем достаточно...). ХОТЯ - можно и весь контент переиндексировать (что аналогично убиранию галочки "Переиндексировать только измененные")...

Поделитесь плиз соображениями - как лучше сделать такой скрипт (может у кого есть какие заготовочки, примеры на сей счёт smile:)
спросил 26 Июнь, 13 от Hak (200 баллов)

8 Ответы

00 голосов
А вот нерабочий теперь код с которым я ковыряюсь уже несколько месяцев, и не могу добиться от него работы smile:(
Он при постановке его на крон с периодичностью каждую минуту (даже на 4-х часовой интервал!) как бы благополучно индексирует все, запускается, НО не останавлвается, не заканчивает свою работу со статусом "stop"... А если вручную через админку индексировать... то все делается оч. быстро (минут 15 н больше).
Вот код:

Код
<?php
$_SERVER["DOCUMENT_ROOT"] = "/home/111/domains/111.ru/public_html";

define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
set_time_limit (0);
define("LANG","ru");
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];

//============== НАСТРОЙКИ =================

// время запуска
$hourmin_start='0000';

// файл состояния
$fname_stat='/home/111/cron/indexing.dat';

//=============== ПОЕХАЛИ ==================

// инициализация переменных
$datehour_now=date("YmdH");
$hourmin_now=date("Hi");

// загрузить файл статуса
$stmp=@file_get_contents($fname_stat);
if($stmp)
   {
   $arIndex=unserialize($stmp);
   }
else{ // начальные настройки
   $arIndex=array(
      'STATUS'   => 'stop',
      'NS'      => array(),
      'CNT'      => 0,
      'STEP'      => 0,
      'LASTRUN'   => '',

      'DATEHOUR'   => 0   // время дата-час последнего запуска
      );
   }

$frun_index=false;
if($arIndex['STATUS'] == 'work')
   { // требуется продолжить индексирование
   $frun_index=true;
   }
elseif((($datehour_now - $arIndex['DATEHOUR']) >= 20) && ($hourmin_start <= $hourmin_now))
   { // можно запускать!
   $arIndex['DATEHOUR']=$datehour_now;
   $arIndex['STEP']=0;
   $frun_index=true;
   }

if(!$frun_index)
   {
   echo 'ReIndex - Stop';

   $stmp=serialize($arIndex);
   $headers = 'From: bobot@111.ru' . "\r\n" .'Reply-To: bobot@111.ru' . "\r\n" .'X-Mailer: PHP/' . phpversion();
   mail('igor@111.su','IndexingStop',$stmp,$headers);

   exit();
   }


//============= ВЫВОД =================
include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

echo 'ReIndex - Run';

if(CModule::IncludeModule("search"))
   {
   $Full=1;
   $max_execution_time=20;

   $res=CSearch::ReIndexAll($Full,$max_execution_time,$arIndex['NS']);
   if(is_array($res))
      {
      $arIndex['STATUS']='work';
      $arIndex['NS']   =$res;
      $arIndex['CNT']   =$res['CNT'];
      }
   else{
      $arIndex['STATUS']='stop';
      $arIndex['NS']   =array();
      $arIndex['CNT']   =$res;
      }

   $arIndex['STEP']++;
   $arIndex['LASTRUN']=date('Y.m.d H:i');

   // сохранить в файле
   if($fp=@fopen($fname_stat,'w'))
      {
      $stmp=serialize($arIndex);

      $headers = 'From: bobot@111.ru' . "\r\n" .'Reply-To: bobot@111.ru' . "\r\n" .'X-Mailer: PHP/' . phpversion();
      mail('igor@111.su','Indexing',$stmp,$headers);

      fwrite($fp,$stmp);
      fclose($fp);
      }
   }
?>


Заранее всем спасибо за ответы!
ответил 26 Июнь, 13 от Hak (200 баллов)
00 голосов
Начну с того, что посетую на такую необходимость.
Зачем так делать если весь контент заносимый через API обновляется автоматически?

Во вторых совершенно не понимаю зачем реализовывать пошаговую переиндексацию из под крона?
Это приводит к лишней нагрузке и не более того.
Именно из под крона эффективней всего не использовать шаги (настроив time_limit с запасом).

Тогда все сведется просто к:
Код
$res=CSearch::ReIndexAll(false, 0);
ответил 22 Июль, 13 от Miso (740 баллов)
00 голосов
Цитата
Maxim Smirnov пишет:
Тогда все сведется просто к:
Код
$res=CSearch::ReIndexAll(false, 0);


Благодарю за совет! А как в таком случае должен полностью выглядеть весь мой файл? Так:

Код
<?php 
$_SERVER["DOCUMENT_ROOT"] = "/home/111/domains/111.ru/public_html"; 

define("NO_KEEP_STATISTIC", true); 
define("NOT_CHECK_PERMISSIONS",true); 
set_time_limit (0); 
define("LANG","ru"); 
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"]; 

//============= ВЫВОД ================= 
include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules­/main/include/prolog_before.php"); 

if(CModule::IncludeModule("search")) 
   { 

   $res=CSearch::ReIndexAll(false, 0); 

   $stmp=serialize($res); 

   $headers = 'From: bobot@111.ru' . "\r\n" .'Reply-To: bobot@111.ru' . "\r\n" .'X-Mailer: PHP/' . phpversion(); 
      mail('igor@111.su','Indexing',$stmp,$headers); 

   } 
?>


Так? И как мне понять что индексация прошла успешно либо НЕуспешно?
ответил 25 Окт, 13 от Hak (200 баллов)
00 голосов
Напишите
Код
$stmp=print_r($res, true);
, думаю в письме будет ответ.
ответил 29 Янв, 14 от Miso (740 баллов)
00 голосов
Цитата
Maxim Smirnov пишет:
Напишите
$stmp=print_r($res, true);, думаю в письме будет ответ.


Спасибо! Так и сделал. Но ничего не приходит на мой емайл smile:( Вот код (может где ошибка закралась? - подскажите, пожалуйста):

Код
<?php
$_SERVER["DOCUMENT_ROOT"] = "/home/111/domains/111.ru/public_html";

define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
set_time_limit (0);
define("LANG","ru");
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];

//============= ВЫВОД =================
include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

if(CModule::IncludeModule("search"))
   {
   $res=CSearch::ReIndexAll(false, 0);

   $stmp=print_r($res, true);
   $stmp1=print_r($res, false);

   $headers = 'From: bobot@111.ru' . "\r\n" .'Reply-To: bobot@111.ru' . "\r\n" .'X-Mailer: PHP/' . phpversion();
   mail('igor@111.su','IndexingOK',$stmp,$headers);
   mail('igor@111.su','IndexingERROR',$stmp1,$headers);
   }
?>
ответил 17 Май, 14 от Hak (200 баллов)
00 голосов
Возможно код верный а прото не хватает лимита времени выполнения скрипта на кроне?
Сейчас веду переговры с хостерами на этот счёт smile;)
ответил 14 Сен, 14 от Hak (200 баллов)
00 голосов
Лучше действительно не делать просто лишней работы. Все, что вносится стандартными средствами (из админки) индексируется и так сразу, все, что втыкается дополнительными скриптами просто требует одельного вызова UpdateSearch (например, для элементов инфоблока --

http://www.bitrix.ru/help/index.html?page=source%2Fiblock%2Fhelp%2Fru%2Fdeveloper%2Fclasses%2Fciblockelement%2Fupdatesearch.php.html)
ответил 19 Янв, 15 от Revola (140 баллов)
00 голосов
Цитата
Maxim Smirnov пишет:
if(CModule::IncludeModule("search"))


Приведите пожалуйста ПОЛНЫЙ пример ПРОСТЕЙШЕГО php файла пригодного для работе на кроне - переиндексирующего весь контент по приведенному Вами выше алгоритму...
А то у меня ничего не получатся :(((
ответил 05 Май, 15 от Hak (200 баллов)

Похожие вопросы

0 голосов
6 ответов
спросил 25 Фев, 13 от Ocupuc (160 баллов)
0 голосов
1 ответ
0 голосов
8 ответов
спросил 08 Июнь, 13 от PAIN (160 баллов)
0 голосов
0 ответов
спросил 05 Май, 14 от andrey500 (100 баллов)