Ускорение форума phpBB при помощи memcached

Дата: Сентябрь 30th, 2008 Автор: EugeneVC

Давно читал о проекте 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 раза.

Популярность: -8%

Категория: Базы данных |

Похожие статьи:

Комментарии

6 Комментариев на “Ускорение форума phpBB при помощи memcached”

  1. Социальная сеть для блоггеров sloger.net сказал:

    Ускорение форума phpBB при помощи memcached…

    Итак имеем phpBB форум, который ужасно тормозит. А тормозит он бедняжка из-за базы mysql, которая не справляется с потоком SQL запросов. Но - в люб…

  2. вебмастер сказал:

    Да, это жаль, что для phpbb2 нет модов…

  3. kiev сказал:

    Memcached действительно дает прирост производительности вашего сайта. Но лучше использовать его в связке nginx(fronten for apache)+apache+eAccelerate+memcached.
    И тогда получите почти идеальный вариант производительности для большинства проектов. У меня после установки на сайте http://eshopes.com получилось рост в 3 раза приблизительно по скорости загрузки и выполнения.
    все стоит на СentOs 5.5 и отлично работает.
    Советую попробовать этот вариант.

  4. Интернет магазин Суперпокупка www.superpokupka.ru сказал:

    Стоит nginx+apache+MySQL+eAccelerator+memcached. Параметры VPS 512Mb 500 Mhz. Сайт подвисает на N секунд прежде, чем отдать контент. Где узкое место? MySQL ест до 50% CPU во время работы (непостоянно).

  5. alpaca сказал:

    А инвалидацией кэша в такой схеме кто будет заниматься?

  6. Алексей сказал:

    Да, непонятно какая процедура будет чистить кэш при его устаревании. По крону?