The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Ускорение форума phpBB при помощи memcached
Решение по кэшированию повторяющихся запросов к MySQL, для оптимизации работы форума phpBB.


Устанавливаем memcached под Debian или Ubuntu:

   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 раза.
 
01.10.2008 , Автор: EugeneVC , Источник: http://lastage.ru/blogs/181.html...
Ключи: memcached, php, optimization / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / PHP / Серверная часть и интерпретатор

Обсуждение [ RSS ]
 
  • 1.1, BOLK, 10:19, 01/10/2008 [ответить] [смотреть все]
  • +/
    Memcached не нужен на localhost, учите другие способы доступа к разделяемой памяти.
     
  • 1.2, EugeneVC, 12:44, 01/10/2008 [ответить] [смотреть все]
  • +/
    Согласен. Но memcached стандартное решение. Применить его можно быстро и не затратно. А использование shm_open функций не всем по силам. Или есть какая нить обертка над этим?
     
     
  • 2.3, uldus, 13:28, 01/10/2008 [^] [ответить] [смотреть все]
  • +/
    >Согласен. Но memcached стандартное решение. Применить его можно быстро и не затратно.
    >А использование shm_open функций не всем по силам. Или есть какая
    >нить обертка над этим?

    Использование memcached - это в первую очередь возможность масштабирования, а shared memory лишь временный выход, по производительности не выигрывающий у memcached, особенно работающего через unix socket. Дополнительный геморой - вечные глюки кеширования через средства разных php-акселераторов, в багзилах которых то и дело поднимаются очередные утечки памяти.

     
     
  • 3.6, User294, 18:47, 01/10/2008 [^] [ответить] [смотреть все]
  • +/
    >разных php-акселераторов,

    Пардон, а php акселераторы кешируют ведь страницу а не запросы к базе, снимая нагрузку на php интерпретер, а не на базу (на нее если только косвенно - если страница отдается как статика запросов к БД на это, очевидно, не делается).

     
     
  • 4.7, uldus, 21:39, 01/10/2008 [^] [ответить] [смотреть все]
  • +/
    >>разных php-акселераторов,
    >
    >Пардон, а php акселераторы кешируют ведь страницу а не запросы к базе,

    Речь про API некоторых php акселераторов, позволяющих хранить ключ/значение в shared memory. Натыкался на пару багов приводящих к утечке памяти в eaccelerator, при использовании данной фичи.

     
  • 1.4, kill9, 18:28, 01/10/2008 [ответить] [смотреть все]  
  • +/
    Криво прикручено, от дедлоков не спасет
     
  • 1.5, User294, 18:45, 01/10/2008 [ответить] [смотреть все]  
  • +/
    phpBB2 имхо давно пора выкинуть в /dev/null.Бажный, с вагоном секурити дыр. phpBB3 - тотальный rewrite с учетом грабель phpBB2.По-моему, 3-я версия намного лучше 2-й.

    P.S. ну не пи..ц?Лечить тормоза базы по сути примитивной DB вида key,value.А если вместо memcached под это скажем, Berkeley DB какоенить припахать или подобную "простую" бд в стиле key, value - интересно, что получится? :)

     
     
  • 2.9, ihanick, 00:11, 03/10/2008 [^] [ответить] [смотреть все]  
  • +/
    berkley db уже перестало биться?
    её можно будет раскидать на 3-4 сервера, для того чтобы обслуживать запросы 50-400 серверов апачей?
    а кеши будут когерентные?
     
     
  • 3.11, User294, 03:36, 03/10/2008 [^] [ответить] [смотреть все]  
  • +/
    А оно еще и биться умеет Что с ним для этого надо делать Как-то не всетречалось ... весь текст скрыт [показать]
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor