Переиндексация сайта при нехватке производительности сервера

Материал из Umicms

Перейти к: навигация, поиск

Одно из требований такое, что на хостинге должен быть установлен php модуль mbstring. Для переиндексации сайта будем использовать немного другой принцип вызова системных методов в кастомном скрипте. Необходимо в корне сайта создать php файл с названием search и таким содержанием:

<?php
      header("Content-type: text/html; charset=utf-8");   
      include "standalone.php";      
 
      mb_internal_encoding("UTF-8");
      set_time_limit(6000);
      $section = 300;
      $search_m = searchModel::getInstance();
 
      if(getRequest('search') == "clear") {
      $search_m->truncate_index();    
      }
      if(getRequest('search') == "begin") {
      $sql_count = l_mysql_query("SELECT COUNT(*) FROM cms3_search", true);
      list($count) = mysql_fetch_row($sql_count);
      if ($count) {
      $count_min = $count - 1;
      $total = $count;
 
			$sql_id = "SELECT rel_id FROM cms3_search LIMIT {$count_min}, {$count}";
			$result_id = l_mysql_query($sql_id, true);
 
			list($id) = mysql_fetch_row($result_id);
      $sql = "SELECT id, updatetime FROM cms3_hierarchy WHERE id = '{$id}'";
      } else {
      $total = 0;
			$sql = "SELECT id, updatetime FROM cms3_hierarchy WHERE is_deleted = '0' AND is_active = '1' ORDER BY id LIMIT 1";
      }
			$result = l_mysql_query($sql, true);
 
      $counter = 0;
 
			while((list($element_id, $updatetime) = mysql_fetch_row($result)) && $counter <= $section) {
			  $counter++;
				$sql = "SELECT id, updatetime FROM cms3_hierarchy WHERE is_deleted = '0' AND is_active = '1' AND id > '{$element_id}' ORDER BY id LIMIT 1";
        $result = l_mysql_query($sql, true);		
				$indexResult = $search_m->index_item($element_id, true);
				if($indexResult === false) continue;
 
			}
			}
 
			echo "Проиндексированно страниц: ".$search_m->getIndexPages()."<br />";
      echo "Количество активных страниц в Hierarchy: ".$search_m->getAllIndexablePages()."<br />";
      echo "Эти два значения должны быть примерно равны! <br /><hr>"; 
 
?>
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Переиндексация сайта</title>
</head>
<body>
<?php
if(array_key_exists('search',$_GET) && $_GET['search'] == "begin"){
$search_m = searchModel::getInstance();
if($search_m->getIndexPages() >= $search_m->getAllIndexablePages()){
$input_value = "stop";
} else $input_value = "begin";  
$value = <<<HTML
<form method="get" id="search" action = "/search.php">
<input style="visibility:hidden" type="checkbox" checked="checked" name="search" value="{$input_value}" />
<input type="submit" value="Идет процесс переиндексации... Ждите." />
</form>
<script language="JavaScript">setTimeout('document.getElementById("search").submit()', 1000);</script>
HTML;
echo $value;
} else{
$value = <<<HTML
<form method="get" action = "/search.php">
<input type = "radio" name = "search" value = "clear" checked="checked"> Очистить индексную таблицу <br />
<input type = "radio" name = "search" value = "begin"> Запустить переиндексацию <br />
<input type="submit" value="Выполнить запрос" />
</form>
HTML;
echo $value;
}
?>
</body>
</html>

Принцип действия прост. В самом коде, для переменной $section устанавливаем значение в диапазоне 100-500, значение выбирается в зависимости от производительности сервера, обычно достаточно 300. После запуска скрипта _http://домен/search.php , выбираем вариант "Очистить индексную таблицу", а потом "Запустить переиндексацию". Скрипт будет индексировать $section страниц за раз, перезагружаясь и сбрасывая используемую php память. Спустя одну секунду, скрипт продолжит свою работу, начав индексировать следующие $section страниц и т.д.

Личные инструменты