Переиндексация сайта при нехватке производительности сервера
Материал из 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 страниц и т.д.
