Умные Сессии

Решение проблем с производительностью.

Исходные данные.

Мы транслируем футбольные матчи через Интернет. Посетителей: в обычные дни 5 000 – 10 000, в дни матчей 100 000 – 150 000. В дата-центре

  • 5 веб-серверов с Apache и PHP, размещенных снаружи через аппаратный балансировщик нагрузки
  • 2 пула кэша памяти: для сессий и данных веб-сервисов
Проблема При большом наплыве посетителей локальная сеть перегружается из-за большого количества обращений к memcache. Усугубляющие факторы: Сеть 100Мбит, оба пула на одних серверах.

Решения

  • Расширение сети до 1Гбит после окончания серии матчей
  • Увеличение времени хранения кэша (как временная мера)
  • Использование технологии смарт-сессии
Сегодня мы поговорим о технологии умных сессий, которую мы использовали для снижения нагрузки.



В чем суть технологии
  1. Мы не создаем сеанс, если он действительно не нужен.

  2. Мы не обновляем сеанс в репозитории, если он не изменился.

На самом деле наш сайт платный, даже если у нас 150 000 уникальных посетителей в день, желающих платить действительно мало.

Посетители распределяются примерно следующим образом:

  • 70% - Зрители.

    Мы открыли главную страницу, поняли, что это не то, что нам нужно, и закрыли ее.

    То есть СЕО поработало хорошо, но разъясните нам это.

  • 28% - Болельщики.

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

    Обычно их не регистрируют, поскольку информация и так доступна.

  • 2% — Они действительно смотрят матчи после регистрации и оплаты.



Выполнение
Поскольку мы используем кэш памяти, у нас уже есть объект Session, который перегружает стандартный функционал сеанса и позволяет хранить последний в кэше памяти.

Дополнительно мы делаем следующее:

  • Мы помещаем глобальную функцию session_start() в if, чтобы сеанс не создавался, когда его не запрашивают.


    if(!empty($_COOKIE[ini_get('session.name')])) session_start();

  • В место входа пользователя добавьте начало сессии, потому что здесь уже нужно:


    if(empty($_COOKIE[ini_get('session.name')])) session_start();

  • И наконец, в нашем объекте мы создаём дополнительную статическую переменную, в которой сохраняем содержимое сессии при чтении, а при записи делаем в самом начале следующую проверку:


    if(self::$data !== null && self::$data == $currentData) return strlen($currentData);

Вуаля, нагрузка на сеть частично снижена, как и на memcache. Затем мы переключили кэширование некоторых блоков на локальные веб-серверы и смогли спокойно дождаться спада посетителей, после чего увеличили пропускную способность сети.

Комментарии приветствуются.

УПД : Смысл поста не в том, чтобы показать, какой я крутой, а в том, что в PCP есть мелочи, которые настолько обыденны, что мы перестаём обращать на них внимание, но иногда они не продуманы и влияют на производительность.

Теги: #memcache #оптимизация #сессии #php

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.