Производительность: BuddyPress. Часть 1.

Для начала о принципе работы BuddyPress. Я не буду углубляться в файлы php и код, так как многим это не нужно, а кому нужно, спросят у меня в комментариях. Давайте посмотрим в базу данных. Вот вы закончили установку BuddyPress, посмотрите на созданные таблицы. По названию некоторых вопросов не возникнет – все будет понятно. Единственно, что может действительно смутить, так вот такие таблицы:

wp_user_1_activity
wp_user_1_activity_cached
wp_user_1_friends_activity_cached

Все три таблицы относятся к одному и тому же пользователю. Именно так, это означает, что для каждого пользователя создается 3 таблицы и если у вас 100 пользователей, то в общей сложности у вас в базе данных будет не менее 350 таблиц (50 – это минимум такое количество используется в WPMU с учетом того, что некоторые плагины тоже создают свои собственные таблицы). Такое количество еще не критично, и даже виртуальный хостинг выдержит нагрузку. Но предположим у вас 1000, или 10000 пользователей. Тогда получается 3000 или 30000 таблиц дополнительно и постоянные запросы к ним. Тут обычным хостинг-планам уже вряд ли есть шанс не справится, только собственные сервера, причем правильно настроенные выдержат.

Решением является (если у вас достаточно денежных ресурсов) покупка нескольких серверов, с разделением базы данных на многие составляющие. Я имею в виду, что предположим в одной базе данных у вас всего по несколько сот пользователей. Тогда несколько тысяч баз данных – и многомиллионная аудитория ничего не заметит. Многие хостинг-провайдеры предоставляют такую возможность – неограниченное количество баз данных, единственным минусом является стоимость :)

Кстати, на создание 1 миллиона таблиц в базе данных специальному скрипту необходимо 27 часов, это при том, что в таблице только 2 колонки и 1 строка (пустая).

Есть вариант использования разработки людей, специализирующихся на оптимизации баз данных. Чтобы получить иной вариант решения проблемы, я поискал в интернете и нашел ресурс The Lyceum Project.

В основе этого проекта лежит процесс изменения архитектуры таблиц в базе данных, что в конечном итоге уменьшает их количество и, следовательно, увеличивает скорость ответа на запросы. Их web-программы помогают разбить все данные и разместить их в несколько БД и даже несколько web-серверов.

Но вернемся к BuddyPress. Помимо сложной архитектуры таблиц в БД он еще создает одну папку для каждого пользователя. Тоже неудобно, особенно для Unix систем (там есть ограничения для web-серверов на количество создаваемых папок; подробней рассказать не могу – я не специалист Unix). Это означает, что для миллиона пользователей BuddyPress создаст миллион папок, в каждой из которых будут храниться файлы одного пользователя – закачанные им фото и другие материалы.

Что можно сделать со всем этим? Как увеличить скорость работы? Как дать возможность серверу работать без проблем при больших нагрузках?

Помимо использования (при желании) разработок The Lyceum Project можно, и даже необходимо, использовать:

  1. eAccellerator или XCache, что значительно уменьшит нагрузку на сервер (доступно только на своем сервере или выделенном хостинге иногда, на виртуальном не получится, не будет необходимых прав доступа)
  2. W3 Total Cache, который уменьшит количество запросов к серверу за счет кеширования страниц для неавторизованных пользователей.
  3. Есть еще несколько тактик оптимизации WordPress MU, на котором собственно и работает BuddyPress. Эти тактики может использовать любой блоггер. О них я расскажу в другой раз.

Какой же можно сделать вывод? Если вы делаете портал, ориентированный на аудиторию по объему равному Вконтакте, Facebook или LJ, то будьте готовы к внесению изменений, оптимизации существующих стандартных настроек WPMU и BuddyPress.

Если же вы создаете социальную сеть для друзей, сотрудников (только не корпорации, а компании с максимум несколько тысяч человек), для узкого круга людей (любителей надувных шариков и засыпать на крыше под луной), то комбинация BuddyPress+WordPress MU даст вам именно то, что вы ищете – удобство, многофункциональность и комфорт. И помните, что уже столько плагинов разработано, что не хватит жизни их все перепробовать.

комментариев 19

  1. Sashka:

    А разработчики ничего по этому поводу не говорят? Может есть какие-то планы по оптимизации таблиц? Меня тоже напрягло, что каждому бзеру создается столько таблиц.
    А кстати, как часто они используюются? При каких действиях пользователя к ним скрипты обращаются?

  2. Разработчики говорят, что это наиболее оптимальный вариант, который обеспечит скорость отзыва на запросы пользователя. Менять они ничего не собираются (по-крайней мере, сейчас).
    Как видно из названия этих таблиц, они вызываются при просмотре активности, как своей, так и друзей. Причем активность кешируется, что несомненно хорошо. Обращаются при просмотре:
    Активность -> Только я
    Активность -> Мои друзья
    Главная -> При использовании виджета активности
    Делает от 1 до 4 запросов к этой таблице (на разных страницах по разному)

  3. Sashka:

    Может немного оффтопик, просто не знаю где еще спросить.
    Как в шаблоне статичной страницы (page.php) можно вывести функции из шаблонов buddyPress, такие как например bp_group_random_members()?
    В обратную сторону все работает, т.е. функции wordpress в шаблонах buddypress/ Целый день голову ломаю никак не выходит.

  4. Тут надо в каждом конкретном случае отдельно смотреть. Самый простой вариант – выдирать целые блоки div из шаблонов BuddyPress, которые содержат нужные вам функции. Смотрите по контексту – начало блока идет вывода случайных пользователей – скопировали аж до закрывающих тегов этого же блока.
    Естественно, понадобится еще и css-форматирование.

  5. Sashka:

    А может есть какая-нибудь функция вывода определенного кол-ва юзеров, которые состоят в определенной группе по ID?
    Мне надо на статичную страницу вывести юзеров которые входят в группу с ID=2.

  6. Покрутите код в шаблоне member-themes. В частности, смотрите код в файле groups/list-members.php на строках 51-63. Там вывод ВСЕХ участников группы. Так же посмотрите мой плагин “Избранные”. Там есть код, из которых можно составить то, что вам нужно. В “Избранных” можно определять отдельную группу, если его отредактировать то, можно получить, что вам нужно.

  7. Kaizer:

    Скажи, а какой файл в buddypress отвечает за вывод основной информации о пользователе ( фото, имя, @nik). копался, так и не нашёл.
    Заранее спасибо

    • Файл members/single/member-header.php в шаблоне.

      • Kaizer:

        А есть ли какой нибудь плагин, который все вкладки на странице (Активность, Друзья, профиль и т.д.) делает так, чтоб нажимая на них вся страница не перезагружалась, а только область вкладки?

        • Плагина нет. Можно попробовать на соответствующих страницах убрать во вкладках класс no-ajax. Может помочь, или не помочь.

          • Kaizer:

            Его просто удалить – вообще не работает( как и при замене на ajax).

  8. marfix:

    Подскажите пожалуйста, у меня не работает аякс. При добавлении записи экран дернется и запись не появляется и также с кнопкой “Загрузить еще” Куда рыть непойму… Уже и плагины все отключал – не помогло…

  9. Добрый день.
    Выбираю для создания сети между Boonex Dolphin 7.0.4 и BuddyPress 1.2.7. BuddyPress несомненно проще в развертывании и обслуживании, но Dolphin 7 мощнее по числу возможностей. Или я не прав? И для BuddyPress также есть чаты, видеоответы, фото галереи в профиле пользователей, события и т.д.?

    • Jettochkin:

      в BP пока ничего серьезного в части видео-фото нет.. возможно к концу года это все появится

  10. Jettochkin:

    slaFFik,

    предлагаю сменить WP Super Cache на W3 Total Cache – куда лучшее решение (и работает без переписывания реврайтов в nginx)

    • Да, согласен. Исправил.

    • Максим:

      После удаления W3 Total Cache сайт перестал работать наглухо, кроме единственной главной страницы…

      Полазил и на англоязычных сайтах, как удалить этот плагин без последствий – березультатно.

      Так вот – может отдельную тему посвятите удалению этого плагина, уважаемые админы?

      • Надо сделать следующее:
        1) Очистить весь кеш (обязательно).
        2) Сразу же после этого деактивировать (не удалить!) плагин.
        3) Зайти в папку /wp-content/ и удалить/переместить все, что связано с кешом и плагином W3ЕС.
        4) Удалить из wp-config.php запись define('WP_CACHE', true);.
        5) Удаить из .htaccess все правила переадресации, которые были добавлены плагином (если у вас обычный WP – то можно удалить все содержимое файла, если там нет чего-то вашего).

  11. nickollo:

    Здравствуйте! Вот у меня проблемка одна есть. Ставлю плагин BP-Album. русский язык там есть, только как его переключить с английского не пойму. Исходник уже перечитал пару раз, не знаю… Помогите, пожалуйста!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *