Внимание!
Не все расширения для phpBB 3.2 совместимы с phpBB 3.3, главным образом из-за неверного синтаксиса в определениях сервисов (отсутствия обрамляющих кавычек - '...').
Перед обновлением необходимо убедиться в совместимости всех расширений.
Рекомендуется предварительно тестировать обновление на копии конференции (локально или на сервере).

Кэширование форума для гостей и ботов

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Kot
phpBB 2.0.0
Сообщения: 207
Стаж: 11 лет 2 месяца
Благодарил (а): 17 раз
Поблагодарили: 34 раза

Кэширование форума для гостей и ботов

Сообщение Kot »

Как и многие, у кого форум на шаред-хостинге достиг предела 2000 уников в сутки, я столкнулся с жалобами хостера на превышение нагрузки на сервер. У каждого хостера свои ограничения: кто количество запросов к базе ограничивает, кто нагрузку на CPU, кто ещё как...

В основном советы по улучшению производительности в итоге сводятся к типичным ответам:

меняй хостера (это тем, у кого и 100 посетителей уже много для хостера);
переходи на VPS/VDS (правда, странно как-то брать выделенный сервер всего для 2к уников);
переноси форум ко мне (заманчивый вариант, но выгода предлагающей стороны непонятна, а непонятное пугает).


В итоге пришла в голову мысль написать мод для кеширования выдачи страниц гостям и ботам.

Не знаю, как у кого, но у меня на форуме поисковый трафик составляет 80%, а следовательно это незарегистрированные пользователи. В таком случае, если у меня для улучшения производительности маркировка тем для гостей отключена, то зачем, спрашивается, каждому боту или гостю показывать свою уникальную страницу?

Общий алгоритм прост:

основной функционал встраивается в page_header() и page_footer()
если зашёл гость или бот -- выдать ему закешированную страницу для этого урла, если нет закешированной страницы -- сгенерить и сохранить в кеше для "следующих поколений"

Можно алгоритм ещё и прооптимизировать немного: например, если в какую-то тему добавляется новое сообщение, то удаляются файлы кеша для этой темы, для списка тем этого форума, для списка форумов и т.д.

Локальный эксперимент показал довольно хороший результат: страница со списком из 100 тем генерилась в среднем 1,3 секунды, после кеширования -- 0,2 секунды. Разница в 6 раз. Конечно, на продакшне будут другие цифры, там этот же список тем генерится 0,25 секунды, но даже если получится сократить время генерации вдвое -- это уже большой успех, не находите?

А теперь вопросы и сомнения.

Почему подобное до сих пор не было сделано командой разработчиков phpBB? Ведь идея-то на поверхности лежит? Я чего-то не понимаю, не учитываю? Какие могут быть подводные камни? Что следует учесть при разработке?

Очень хочу услышать мнения опытных людей, чтоб знать, стоит ли вообще браться.
Последний раз редактировалось Kot 11.02.2013 12:24, всего редактировалось 1 раз.

Аватара пользователя
Pazh
Former team member
Сообщения: 2194
Стаж: 10 лет 6 месяцев
Благодарил (а): 41 раз
Поблагодарили: 455 раз

Re: Кеширование форума для гостей и ботов

Сообщение Pazh »

Ну вот пример: есть тема, в теме 30 сообщений, в настройках форума стоит что отображать на странице 25 постов. Имеем первую страницу топика с ссылкой site.ru/viewtopic.php?f=1&t=1
Мы ее закешировали.
А теперь имеем 25 ссылок вида site.ru/viewtopic.php?p=1#p1 ... site.ru/viewtopic.php?p=25#p25 которые по сути являются аналогом первой ссылки и ведут на ту же самую страницу.
А еще есть куча сортировок - под каждый вид кеш отдельный делать?

Далее правим один пост из 25 - кеш страницы пересобираем
Удаляем один пост на странице - вообще писец: пересобираем кеши ВСЕХ страниц этой темы
Баним юзера, выносим ему предупреждение, снимает пред, выводим из бана, меняется какая-либо инфа из профиля юзера, которая отображается при просмотре форума, изменили репутацию, звание, аватарку и т.д. и т.п. - полный ахтунг- пересобираем кеши ВСЕХ страниц где есть посты этого юзера.

И т.д. и т.п.

Посмотрите на объем таблицы phpbb_posts - этоже нужно будет держать в кеше
форум ЖК Вестердам Помощь в ЛС/email только за WM или ЯД

Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 14991
Стаж: 14 лет
Откуда: Красноярск
Благодарил (а): 381 раз
Поблагодарили: 1700 раз

Re: Кеширование форума для гостей и ботов

Сообщение rxu »

Что вы понимаете под кэшированием страниц?
В phpbb и так имеет место кэш, как для скриптов, так и для стилей, и для запросов в БД.
Можно подключать серверные системы кэширования - APC, XCache, eAccelerator, memcache, memory, wincache, redis.

Какое колесо требуется изобрести?
Изображение

Аватара пользователя
Pazh
Former team member
Сообщения: 2194
Стаж: 10 лет 6 месяцев
Благодарил (а): 41 раз
Поблагодарили: 455 раз

Re: Кеширование форума для гостей и ботов

Сообщение Pazh »

Я так понял - он хочет иметь слепок всей страницы и при входе гостя/бота не делать кучу запросов в базу + не строить стиль, а отображать этот слепок.
Да забыл - малейшая правка в стиле приведет к необходимости переделывать кеши всего форума (а если там пару сотен тысяч постов?) - ИМХО сервер падет смертью храбрых
форум ЖК Вестердам Помощь в ЛС/email только за WM или ЯД

Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 14991
Стаж: 14 лет
Откуда: Красноярск
Благодарил (а): 381 раз
Поблагодарили: 1700 раз

Re: Кеширование форума для гостей и ботов

Сообщение rxu »

Просто есть предположение, что основное тут вот это:
Kot писал(а):Как и многие, у кого форум на шаред-хостинге достиг предела 2000 уников в сутки, я столкнулся с жалобами хостера на превышение нагрузки на сервер.
КэширУй - не кэширУй, всё равно получишь как обычно.
Изображение

Аватара пользователя
Kot
phpBB 2.0.0
Сообщения: 207
Стаж: 11 лет 2 месяца
Благодарил (а): 17 раз
Поблагодарили: 34 раза

Re: Кеширование форума для гостей и ботов

Сообщение Kot »

Начну отвечать с конца. :)

Кстати, спасибо большое за дельные советы. Самостоятельно все случаи предусмотреть сложновато, а так, глядишь, и наберётся база тест-кейзов.
Pazh писал(а):Я так понял - он хочет иметь слепок всей страницы и при входе гостя/бота не делать кучу запросов в базу + не строить стиль, а отображать этот слепок.
Да, действительно, это и есть основная идея. Подняли сессию для юзера -- проверяем его статус. Если бот или неавторизованный -- берём остальную страницу из кэша, если есть. Кстати говоря, первоначальная идея встроить начало кеша в page_header() не совсем оптимальна. В той же viewtopic львиная куча логики происходит ещё до генерации заголовка. Имеет смысл начинать кешировать в самом начале функциональных страниц, сразу после поднятия сессии, но тогда уже и о gzip нужно будет помнить, ещё ведение статистики нужно будет вынести наружу...
Pazh писал(а):Посмотрите на объем таблицы phpbb_posts - этоже нужно будет держать в кеше
Pazh писал(а):Да забыл - малейшая правка в стиле приведет к необходимости переделывать кеши всего форума (а если там пару сотен тысяч постов?) - ИМХО сервер падет смертью храбрых
Так, сразу хочу уточнить, что нет никакой необходимости собирать все кеши СРАЗУ. Бот открыл страницу -- страница сохранилась в кеше, только так. Другой бот до истечения ttl открыл эту страницу -- она поднялась из кеша. В этом случае ваш пример с правкой стиля нагрузит сервер только в том плане, что придётся удалить все файлы кеша.

Я не думаю, что на живом продакшн-сервере так уж часто меняется стиль. А если и меняется при релизе, то в любом случае кэш стоит очистить. Если я не буду делать это автоматически, то как минимум напишу предупреждение пользователям на странице администрирования.
Pazh писал(а):Ну вот пример: есть тема, в теме 30 сообщений, в настройках форума стоит что отображать на странице 25 постов. Имеем первую страницу топика с ссылкой site.ru/viewtopic.php?f=1&t=1
Мы ее закешировали.
А теперь имеем 25 ссылок вида site.ru/viewtopic.php?p=1#p1 ... site.ru/viewtopic.php?p=25#p25 которые по сути являются аналогом первой ссылки и ведут на ту же самую страницу.
А еще есть куча сортировок - под каждый вид кеш отдельный делать?
Хорошие примеры, спасибо. Вот только вы не учли одного: кешироваться будут страницы, выдаваемые гостям и ботам. Скажем так, часто ли у вас на форуме гости, и тем паче боты, используют сортировку для вывода тем? Даже более того -- вы лично давно пользовались этим функционалом? ;) А даже если какой настырный гость и воспользуется сортировкой -- что же, придётся сохранить в кеше ещё один файл. К которому, возможно, никто больше никогда и не обратится, ну да запас карман не тянет. ;)

Потом, насчёт ссылок на посты. Я знаю, что можно прямо обратиться к конкретному post_id, topic_id и так далее. Только насколько я могу видеть, в живом виде эти ссылки нигде не даются. Лично у меня на форуме они всегда формируются по шаблону viewtopic.php?f=4&t=5741#p63784. А если и не так... Что же, придётся предварительно проводить резолвинг топика и форума по посту.

Очевидный минус, который я пока вижу, это разбухание кеша со временем до неприличных размеров. Ведь я правильно помню, что в phpBB нет никаких кронов вида "очистить старый кеш"? Давайте прикинем размеры. У меня на форуме 150 000 сообщений, 8 000 тем. При стандартных настройках это будет примерно 15 000 страниц (грубо). Предположим, что одна страница занимает у нас около 150 кб с gzip, около 250 кб без упаковки. Итого, для моего форума, который сейчас со всякими файлами и прочей ботвой занимает около 4 гигабайт, кэш всех страниц займёт ещё максимум 3-4 гигабайта. Это вполне вкладывается в мой тарифный план, ещё и сдача остаётся. Дисковое пространство сейчас стоит очень дёшево, в отличие от дополнительных процессорных мощностей.

Ещё есть проблема с 15 000+ файлов в папке кеша. Как это может сказаться? Помню, под виндами была в своё время проблема получения списка файлов, когда в папке их больше 7 000 -- всё тормозило непропорционально. Но вроде бы под линуксами такого нет? К тому же нам не нужен весь список, нам нужны будут только единичные файлы по конкретному имени.
rxu писал(а):КэширУй - не кэширУй, всё равно получишь как обычно.
Безусловно, в конечном итоге, с ростом посещений форума, всё равно придётся переползать на тариф выше, потом на VPS, потом на dedicated сервер, потом на кластер... *эх, мечты, мечты...* Но согласитесь, одно дело платить за VPS 30$ в месяц, когда у тебя на форуме 2к уников, и другое дело платить эту же сумму, когда у тебя на форуме 4к, а то и 6к уников? Оптимизация в таких делах всегда в тему, простое добавление мощностей -- это топорное решение.

В общем, буду рад дальнейшей критике и замечаниям. Пока меня не переубедили, но заставили обратить внимание на множество нюансов, которым я вначале не придал значения.

Аватара пользователя
МайскийЖук
phpBB 3.0.6
Сообщения: 2388
Стаж: 10 лет 7 месяцев
Благодарил (а): 17 раз
Поблагодарили: 304 раза

Кеширование форума для гостей и ботов

Сообщение МайскийЖук »

У меня на форуме 150 000 сообщений, 8 000 тем.
Не при таких цифрах задумываться о кэшировании страниц для ботов. Это смешно.
Любовь и боль, покой и бой я как любой несу с собой…

Аватара пользователя
Kot
phpBB 2.0.0
Сообщения: 207
Стаж: 11 лет 2 месяца
Благодарил (а): 17 раз
Поблагодарили: 34 раза

Re: Кеширование форума для гостей и ботов

Сообщение Kot »

Ботов и гостей. В первом сообщении я писал, что у меня на форуме 80% посетителей -- поисковый трафик.

Аватара пользователя
sweetah
phpBB 2.0.6
Сообщения: 501
Стаж: 10 лет 4 месяца
Благодарил (а): 106 раз
Поблагодарили: 26 раз

Re: Кеширование форума для гостей и ботов

Сообщение sweetah »

Kot писал(а):одно дело платить за VPS 30$ в месяц
А другое дело платить 20$ за реальный выделенный сервер :)

Аватара пользователя
Kot
phpBB 2.0.0
Сообщения: 207
Стаж: 11 лет 2 месяца
Благодарил (а): 17 раз
Поблагодарили: 34 раза

Re: Кеширование форума для гостей и ботов

Сообщение Kot »

Увы, не в Беларуси. У нас тут пока еще подобный сервис стоит очень дорого (по сравнению).

В любом случае, ещё какие замечания интересные по реализации есть?

Аватара пользователя
sweetah
phpBB 2.0.6
Сообщения: 501
Стаж: 10 лет 4 месяца
Благодарил (а): 106 раз
Поблагодарили: 26 раз

Re: Кеширование форума для гостей и ботов

Сообщение sweetah »

Kot, а вам нужна пешая доступность к серверу? Или из Беларуси нельзя оплатить зарубежный хостинг?

Аватара пользователя
Kot
phpBB 2.0.0
Сообщения: 207
Стаж: 11 лет 2 месяца
Благодарил (а): 17 раз
Поблагодарили: 34 раза

Re: Кеширование форума для гостей и ботов

Сообщение Kot »

У меня есть украинский хостинг, собственно, сайт до какого-то времени висел именно на нём. Но так уж получается, что половина аудитории сайта -- именно Беларусь, и скорость доступа к сайту всё же намного приятнее, когда он установлен практиески локально, нежели "где-то там".

Именно поэтому мне всё же хочется оставаться на белорусском хостинге, но не хочется сильно уж переплачивать за него. Надеюсь, я достаточно подробно ответил по этому вопросу, чтоб снизить уровень троллинга? ;)

Аватара пользователя
sweetah
phpBB 2.0.6
Сообщения: 501
Стаж: 10 лет 4 месяца
Благодарил (а): 106 раз
Поблагодарили: 26 раз

Re: Кеширование форума для гостей и ботов

Сообщение sweetah »

Kot, да какой там троллинг ) Просто интересно было разобраться. Вы, наверное, просто не пробовали европейский хостинг, особенно голландский. Не знаю точно насколько больше будет пинг относительно украинских серверов, но разницу пользователи не почувствуют.
Извините за оффтоп.

Аватара пользователя
Kot
phpBB 2.0.0
Сообщения: 207
Стаж: 11 лет 2 месяца
Благодарил (а): 17 раз
Поблагодарили: 34 раза

Re: Кеширование форума для гостей и ботов

Сообщение Kot »

Проблема не в серверах. Проблема в каналах "наружу", из Беларуси. А они, к сожалению, ограничены, только в последнее время что-то стало более-менее развиваться.

Аватара пользователя
Kot
phpBB 2.0.0
Сообщения: 207
Стаж: 11 лет 2 месяца
Благодарил (а): 17 раз
Поблагодарили: 34 раза

Re: Кеширование форума для гостей и ботов

Сообщение Kot »

Проверил работу прототипа на живом сервере. Должен сказать, результат впечатляет.

В среднем страница темы без использования этого мода открывается 0,14 с. С использованием полного кеширования страницы -- 0,013 с. Таким образом при просмотре тем гостями нагрузка на сервер снижается в 10 раз (с условием попадания в кеш).

Полагаю, имеет смысл кешировать только основной функицонал. Только те страницы, к которым повторное обращение более вероятно (зачем зря кэш загромождать?). Например, тот же viewtopic.php поддерживает кучу разных параметров: view, update, сортировку. Кеширую только когда нет сортировки, не указаны view или update.

Теперь о больном, о размере кэша. Сейчас на форуме 5 пользователей, 4 бота, 15 гостей. Кеширую пока только страницы просмотра тем. Результат за полчаса: закешированные страницы занимают 13 мегабайт (188 файлов), общий размер кеша 16 мегабайт.

Добавлено спустя 5 минут 56 секунд:
Вопрос знатокам крона: если закешируется страница с вызовом крона, то cron будет дёргаться при каждой загрузке этой страницы. Сильно ли это нагрузит сервер, или в механизме крона есть проверка от повторного запуска? Мне немного лениво это смотреть, может кто сходу скажет.

И ещё по крону вопрос: есть ли в кроне готовый таск "почистить устаревший кэш"?

Вернуться в «Для авторов (phpBB 3.0.x)»