MODX, PHP и сборка мусора в сессиях

Вольный перевод свежей статьи от Марка Хамстры.

Когда вы в последний раз проверяли размер таблицы modx_session? Не измерялся ли он в гигабайтах? Если это так, вы не одиноки.

Чтобы понять проблему нужно немного предыстории.

Как работают сессии в PHP?

Обычно стандартный PHP обработчик создает сессию по запросу и сохраняет ее в виде простого файла где-то в системе. Путь, где сохраняется сессия, настраивается с помощью параметра session.save_path в php.ini и может указывать куда угодно. Когда эта опция пуста, сессия записывается во временный каталог на сервере.

Создание и загрузка сессий достаточно просты, но следующая вещь, которую также делает обработчик сессий это очистка сессий. Это называется сборкой мусора, или gc. Она удаляет сессии после истечения срока их действия, чтобы гарантировать, что они не будут расти бесконечно и занимать ваше жизненное пространство на диске.

Сборка мусора не должна выполняться при каждом запросе. Если время жизни вашей сессии/куки-файла задано равным неделе, и вы не слишком требовательны к точному времени, когда они удаляются, тогда сессии нужно проверять только один раз в день. Очистка сессий может потребовать некоторого времени и ресурсов, поэтому PHP по умолчанию настроен на выполнение этого только один раз каждые 100 запросов.

Как работают сессии в MODX?

MODX создает обработчик, который следит за сохранением, получением и очисткой сессий. Он записывает их в одну из своих собственных таблиц базы данных (modx_session), а не в файлы. Это дает MODX немного больше контроля над потоком сессий.

Также возможно для MODX использовать стандартные PHP сессии, и кроме того существует дополнительная возможность для записи сессий в Redis. Но подавляющее большинство сайтов будут просто использовать запись в базу данных по умолчанию.

Итак, почему MODX не очищает свою таблицу сессий?

MODX ожидает сигнала от PHP, что пришло время очистить сессии. За это отвечают два следующие параметра конфигурации в PHP:

session.gc_probability
session.gc_divisor

Вы можете найти официальную документацию для этих параметров здесь.

Обычно в session.gc_probability устанавливается значение равным 1, а в session.gc_divisor — значение, подобное 100 или 1000. Это означает, что примерно в 1/100 запросов будет выполняться сборка мусора.

Когда кажется, что MODX не очищает свою таблицу, это обычно происходит из-за попытки улучшить качество сборки мусора, обходя PHP и выгружая ее в задание по cron'у, которое выполняется вне цикла «запрос-ответ».

Предполагается, что PHP записывает свои сессии в стандартное местоположение файловой системы и очищает этот каталог на основе метки времени в файле. Параметр session.gc_probability тогда устанавливается в 0, чтобы сообщить PHP никогда не запускать свою собственную сборку мусора сеанса.

Это работает прекрасно — в случае, если ваши сессии хранятся обычным образом. Однако, у MODX это не так.

Как часто это происходит?

Основываясь на данных из SiteDash, который автоматически проверяет размер и состояние вашей таблицы сессии, это случается довольно часто. Из выбранных 1727 сайтов 27% похоже сталкиваются с этим.

Как я могу это исправить?

Добавьте параметр session.gc_probability. Установите его значение в 1 и убедитесь, что session.gc_divisor также настроен правильно для вашего трафика.

Это зависит от вашего хостинга, если у вас есть доступ к панели управления сервером, вы можете изменить эти параметры самостоятельно. В других случаях свяжитесь с технической поддержкой хостера и уточните, как это можно изменить.
Антон Тарасов
03 марта 2020, 17:28
modx.pro
3
2 501
+8

Комментарии: 2

Андрей Степаненко
03 марта 2020, 18:41
0
Не выяснял подробности проблемы, но суть в том что если хранить сессии на диске, то происходит блокировка сессии. То есть, пока первая страница не загрузится до конца. Вторая не начнет грузится, так как первая еще не записала сессию.
При хранении сессий в базе (как у modx по умолчанию), то что происходит со старой сессией? Так как блокировка при хранении в базе не срабатывает.
    Василий Наумкин
    04 марта 2020, 04:57
    1
    0
    Статья 2014 года — bezumkin.ru/sections/tips_and_tricks/2422/
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      2