InterMaster.com.ru

Разное и возможно полезное

Оптимизация партнёрского магазина DVDdom.ru

Просмотров: 6277Комментарии: 2
Рубрика: СайтостроительствоМетки:

Я достаточно давно участвую в партнерской программе интернет-магазина по продаже видеофильмов 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."/ . Может что-то еще, я уже за давностью лет не помню.

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Вы можете войти под своим логином или зарегистрироваться на сайте.

Выберите человечка с поднятой рукой!

При нажатии на картинку, Ваш комментарий будет добавлен.