DElf Постоянный посетитель
Зарегистрирован: 20.07.2015 Сообщения: 190 Откуда: Миасс
|
Добавлено: Вс 27 Сен 2015 г. 20:57:25 Заголовок сообщения: Ускорение выдачи, использование memcache |
|
|
Доброго времени суток,
У меня предложение по скорости работы сайта. В нагруженные часы ощущаются тормоза выдачи страниц
Как таковой проблем не испытываю, но сижу на оптике и хочется чуть большей скорости от любимого форума. Думаю, многие разделяют мое желание.
Рассмотрите пожалуйста, частичный переход на memcached - если технические возможности позволяют это.
Цитата: | Итак имеем phpBB форум, который тормозит, а тормозит он бедняжка из-за базы mysql, которая не справляется с потоком SQL запросов. Но - в любом проекте есть такие SQL запросы, которые повторяются многократно, например, это запросы статистики. И бедняжка mysql загружен этими повторяющимися запросами. Вы скажите у mysql есть кеш - кеш то есть, только он не знает что данные не изменились и выполняет запрос снова. Ведь только мы знаем, что данные для некоторых запросов еще не изменятся часа 2.
Устанавливаем memcached под Debian или Ubunta.
Код: | apt-get install memcached php5-memcached |
После установки не забываем перезагрузить apache или php-cgi. Что бы php увидел новые модули.
Включаем( если уже не включен) лог медленных запросов у mysql.
Код: | log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 3 |
и ждем с часик - пьем кофе и смотрим фильм. После просмотра любимого фильма смотрим что-же туда накапало. Если у вас там пусто - можно вас поздравить - вам еще не нужна оптимизация. У меня туда накапало порядка 4000 запросов - из них легко было выделить запросы типа :
Код: | SELECT_COUNT(user_id)_AS_total_____FROM_phpbb_users_____WHERE_user_id_<>_-1 |
Запрос постоянно подсчитывал количество пользователей форума на phpBB. Понятно, что это число не особо важно - это просто статистика. Значит данные по этому запросу можно закешировать часика на 2.
Для этого открываем файл includes/functions.php ищем функцию get_db_stat() - в ней лежат наши жирные запросики.
находим код:
Код: | if ( !($result = $db->sql_query($sql)) ){
return false;
} $row = $db->sql_fetchrow($result); |
изменяем на
Код: |
$memcached = new Memcache;
$memcached->connect('localhost', 11211);
if(!$row = $memcached->get($sql)){
if ( !($result = $db->sql_query($sql)) ){
return false;
} $row = $db->sql_fetchrow($result);
$memcached->set($sql, $row, MEMCACHE_COMPRESSED, time() + 7200);
}$memcached->close();
|
Смысл изменения состоит в том, что в memcached данные хранятся парами (ключ, значение). Ключём служит SQL запрос - он уникальный. Алгоритм приведенного кода состоит в следующем:
соединяемся с memcached, смотрим если такие данные по ключу, если нет только тогда дергаем базу, если есть - то идем дальше - не посылая на базу никаких запросов. Надеюсь экономия всем понятна.
Немного о грустном - модов для phpBB + memcache я не нашел. Зато в phpbb3 эта поддержка заявлена. А для phpBB2 придется самому выискивать такие запросики для кеширования, а ведь еще есть моды - они тоже генерят запросики. Если все сделать правильно - тормоза базы можно сократить в 2-3 раза. |
Веду к тому что пользователей без авторизации, можно отправлять в кеш который храниться скажем, 3 часа, а пользователей которые сидят зарегистрировались на 5 минутный кеш, вот таким образом снизить нагрузку на базу можно очень сильно и повысить скорость выдачи.
p.s. надеюсь на ваше понимание и содействие. _________________ Чернильный шопоголик |
|