Проблема:

У меня есть веб-сайт, который использует сеансы PHP, чтобы пользователи могли входить в систему. Он отлично работает. Но сеанс истекает слишком рано, поэтому 1 минута бездействия приведет к выходу пользователя из системы.

Мое окружение:

Версия PHP: 7.1

Сервер: NGINX

Фреймворк: CakePHP 3.5

Чем я занимался до сих пор?

Я применил каждое решение в StackOverflow или в любом полученном мной результате поиска. Я увеличил время ожидания сеанса как в конфигурациях php.ini, так и в CakePHP.

Решение

Через 2 или 3 дня исследований я нашел решение. В моем php.ini я нашел конфигурацию с именем session.gc_probability и поставил для нее значение 0. Теперь мои сеансы никогда не истекают, за исключением случаев, когда пользователь выходит из системы намеренно.

И теперь моя текущая проблема: я не хочу, чтобы моя конфигурация session.gc_probability была равна нулю, поскольку она не будет собирать мусор (не совсем уверен в этом. Пожалуйста, поправьте меня, если эта информация неправильный.). И это приведет к тому, что сеансы будут оставаться в течение месяца или лет, что является настоящим МУСОРОМ для сервера.

У меня появилась идея присвоить session.gc_probability нулевое значение из здесь

session.gc_divisor coupled with session.gc_probability defines the 
probability that the gc (garbage collection) process is started on 
every session initialization. The probability is calculated by using 
gc_probability/gc_divisor, e.g. 1/100 means there is a 1% chance that 
the GC process starts on each request. session.gc_divisor defaults to 
100.

Что именно не так с моими конфигурациями? Что заставляет сборщик мусора удалять мои сеансы в ближайшее время? session.gc_probability было 1, а session.gc_divisor было 1000. Я думаю, что процесс с вероятностью 1/1000 не должен запускаться каждые 1-2 минуты.

4
Peshraw H. Ahmed 25 Май 2018 в 15:29

1 ответ

Лучший ответ

Согласно вашим последующим комментариям, ваша настройка для Session.handler - php. В документации по сеансам :

Встроенные конфигурации:

  • php - сохраняет сеансы со стандартными настройками в вашем файле php.ini.
  • cake - сохраняет сеансы как файлы внутри tmp/sessions. Это хороший вариант для хостов, которые не позволяют писать за пределами вашего собственный домашний реж.

[…]

Настройка php.ini по умолчанию для session.save_path зависит от вашего дистрибутива PHP (и его можно изменить в любом случае), но обычно он включает в себя общее хранилище данных для всех приложений PHP, которые не отказываются. Это означает, что приложение с самым коротким session.gc_maxlifetime < / a> скорее всего удалит данные сеанса из других приложений.

Переход на cake должен решить эту проблему.


Небольшое продолжение по поводу session.gc_probability и session.gc_divisor. Установка их слишком агрессивно приведет к частой сборке мусора. Это может снизить производительность, но не приведет к преждевременному истечению срока хранения данных. С другой стороны, слишком свободные значения все равно позволят доступ к устаревшим данным.

1
Álvaro González 4 Июн 2018 в 08:45