Я достаточно давно участвую в партнерской программе интернет-магазина по продаже видеофильмов DVDdom.ru. Партнёрка достаточно интересная - ассортимент большой, цены приемлемые, народ фильмы покупает – в общем, все достойно. Одна беда – стандартные скрипты, которые предоставляет DVDdom.ru для построения собственного интернет-магазина, недостаточно оптимизированны в плане минимизации нагрузки на сервер. В результате недорогие хостеры часто блокируют аккаунт с установленными на них партнерскими магазинами из-за превышения предельной нагрузки на сервер. Пару раз поменяв хостера по данной причине, я решил все-таки найти время и заняться вопросом оптимизации скриптов. И вот что у меня получилось.
Как оказалось, значительную нагрузку на сервер создает таблица «activeSessions» базы данных магазина. В ней хранятся все сессионные ключи за последние 720 часов. У меня размер данной таблицы достигал 2Мб и число записей в ней около 15 000. Причем данная таблица скриптами используется очень часто – практически при каждой загрузке новой страницы магазина происходит обращение к таблице на предмет существования сессионного ключа для данного IP и удаления устаревших записей. Особенно «весело» приходится в тот момент, когда на сайт «наваливается» какой-нибудь поисковый бот.
Первое, что сделал – это перенес скрипт очистки таблиц «activeSessions» и «baskets» из файла toall.php в отдельный файл cron.php и установил его ежедневный вызов через Cron. Таким образом, нагрузка на сервер немного снизилась – теперь проверка на устаревшие записи и их удаление стала происходить только раз в день.
Далее на партнерском форуме нашел интересное решение снижение числа запросов к таблице «activeSessions». Один из участников партнерской программы, также столкнувшийся с проблемой чрезмерной нагрузки на хостинг стандартных скриптов, проанализировал таблицу и увидел, что 80% сессий принадлежат поисковым ботам. А ведь боты ничего не покупают и не заказывают и, следовательно, сессионные ключи им ни к чему! Поэтому скрипт toall.php был доработан таким образом, что прежде чем обратится к таблице «activeSessions» он проверяет, не с ботом ли он имеет дело, и если с ботом, то сессия не создается и к таблице обращение не происходит. В итоге и размер таблицы, и число обращений к ней снизилось в десятки раз и проблема с нагрузкой была решена!
Теперь непосредственно о том, что, где и на что менять.
Чтобы удаление устаревших записей выполнялось раз в сутки, из файла toall.php удалил строки:
$str ="select UID from activeSessions where "; $str .= " SUBDATE(NOW(), INTERVAL $Hours_for_cookie HOUR) > LastActionData"; $result=mysql_query($str) or die("error 1"); if (mysql_num_rows($result) >0){ $strUID ="("; while ($row=mysql_fetch_array($result)){ if ($strUID!="(") $strUID .=", "; $strUID .="'".$row[0]."'"; } $strUID .=")"; $str ="Delete from activeSessions where UID in ".$strUID; $result=mysql_query($str) or die("error 2"); $str ="Delete from baskets where UIDUser in ".$strUID; $result=mysql_query($str) or die("error 3"); }
После чего создал файл cron.php с кодом:
<?php (include("./config.php")) or die("config"); mysql_connect($host,$user,$password) or die("connection"); mysql_select_db($dbname) or die("db"); error_reporting(0); mysql_query ("set character_set_client='cp1251'"); mysql_query ("set character_set_results='cp1251'"); mysql_query ("set collation_connection='cp1251_general_ci'"); $str ="select UID from activeSessions where "; $str .= " SUBDATE(NOW(), INTERVAL $Hours_for_cookie HOUR) > LastActionData"; $result=mysql_query($str) or die("error 1"); if (mysql_num_rows($result) >0){ $strUID ="("; while ($row=mysql_fetch_array($result)){ if ($strUID!="(") $strUID .=", "; $strUID .="'".$row[0]."'"; } $strUID .=")"; $str ="Delete from activeSessions where UID in ".$strUID; $result=mysql_query($str) or die("error 2"); $str ="Delete from baskets where UIDUser in ".$strUID; $result=mysql_query($str) or die("error 3"); } ?>
и задал его ежедневный вызов из Cron’а.
Теперь поставил фильтр на боты. Для этого в файл toall.php после строк
include("./config.php")) or die("config"); mysql_connect($host,$user,$password) or die("connection"); mysql_select_db($dbname) or die("db");
добавил
$blocked_IP=array('87.250.255.241','72.30.78.227', '74.6.8.117'); if (in_array($_SERVER["REMOTE_ADDR"], $blocked_IP)) {return 1;}
Где в первой строке перечислил IP-ботов (разумеется, в данном примере список ip ботов далеко не полный – вам следует самим его составить на основании анализа записей вашей таблицы). Вот собственно и все. С тех пор партнёрский магазин видео фильмов на DVD работает без сбоев.
Апдейт 01.12.2011: все вышеописанное относится только к старым скриптам. Сейчас магазин обновил скрипты и вышеописанных проблем больше не возникает. Кстати, для тех, кто не в курсе, как выглядит партнерский магазин - смотрите тут - http://video.in-shops.ru/.
Комментариев: 2 RSS
1 Комментатор 3 13-03-2010 06:25
Здравствуйте!
Уже как год работаю в партнерской программе dvddom. прибыль около трех тысяч рублей в месяц, и это с одного партнерского сайта! Тоже столкнулся с проблемой загрузки, но решил её просто сменой тарифа на хостинге. Данный пост для меня как раз кстати. Еще пытаюсь изменить ссылки типа http://сайт.ru/details.php?Id=63204 на http://сайт.ru/dvd/63204/ но изменения в .htaccess это полдела и надо еще в движке изменения делать. Если Вы сталкивались с этим, пожалуйста подскажите решение проблемы.
2 Administrator 13-03-2010 12:36
Я уже довольно смутно помню, как настраивать ЧПУ. Надо было еще в файлах шаблонов .tpl заменить все строки вида http://сайт.ру/viewcategory.php?id=345 на http://сайт.ру/category/345 и в viewcategory.php $PHP_SELF?id=".$curCat."&Page;= на category/".$curCat."/ . Может что-то еще, я уже за давностью лет не помню.