in PHP

Время жизни сессии в PHP

В целях безопасности в проекте достаточно часто может стать вопрос о времени жизни сессии. Так, сессия пользователя должна экспайрится через некоторое время после последней активности, если не уделить этому вопросу достаточно внимания могут возникнуть проблемы безопасности и время жизни сессии будет ограничено лишь тем, когда сработает сборщик мусора и признаёт её неактивной.

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

Обычно код решающий данную задачу достаточно прост и выглядит примерно так

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

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

Сборщик мусора сработает только с определенной вероятностью – которая определяется параметрами session.gc_probability и session.gc_divisor, за что отвечают параметры следует из их названия и таким образом вероятность срабатывания есть probability/divisor, что в случае стандартных настроек php составит 1%.

Конечно можно было бы так настроить эти параметры, что сборщик мусора будет срабатывать чаще, но на сильно нагруженном проекте это может оказаться  “дорогим” решением.

Также стоит обратить внимание на известную историю с ускорением composer на 70% при отключении GC.

Обратим внимание и на такой важный момент – по умолчанию сессии хранятся в файлах (за это отвечает параметр session.save_handler) и время жизни сессии определяется по mtime – modification time, а не по atime (last access time) как могло бы показаться.

Нельзя также вниманием обходить такой важный параметр как session.cookie_lifetime, т.к. может показаться, что именно то, что нужно. Тем не менее этот параметр отвечает лишь за время жизни куки, в которой хранится идентификатор сессии, и даже если кука удалена сессия может продолжать свою жизнь.

По материалам:

  1. Конфигурация сессий в PHP
  2. How do I expire a php session after 30 minutes

 

Leave a Reply