Я пытаюсь выяснить, как сделать сеансы дольше в SLIM PHP Framework. Мне известны зашифрованные файлы cookie и функция сеанса файлов cookie., но я не могу использовать это, потому что данные, которые я храню в сеансе, больше, чем объем памяти, который может содержать cookie.
Есть ли способ сделать сеансы дольше?
Я попробовал следующий код без удачи до сих пор. Сеанс, кажется, длится около пары часов, а затем мне нужно заново войти в систему.
ini_set('session.cookie_lifetime', 60 * 60 * 24 * 7);
ini_set('session.gc_maxlifetime', 60 * 60 * 24 * 7);
session_cache_limiter(false);
session_start();
Сессии PHP очень чувствительны к конфигурации вашего сервера. Есть много возможных мест, где что-то может пойти не так:
Сервер может быть настроен так, чтобы вы не могли устанавливать эти конкретные переменные конфигурации через ini_set
, Если вы не включили отчеты об ошибках для предупреждений, вы можете даже не знать, что эти строки не работают. Ты можешь использовать phpinfo
чтобы увидеть фактические значения, используемые во время выполнения скрипта.
Некоторые операционные системы, такие как Debian и Ubuntu, имеют свой собственный сборщик мусора, который периодически очищает сессии PHP: https://serverfault.com/questions/511609/why-does-debian-clean-php-sessions-with-a-cron-job-instead-of-using-phps-built .
Они не заботятся о вашем gc_maxlifetime
установка; они просто работают по фиксированному графику.
Помните, что сессии PHP просто хранятся в виде файлов на сервере. На (плохо настроенных) общих серверах обычно все учетные записи серверов записывают свои сеансы в один и тот же каталог по умолчанию. Другими словами, ничего не установлено, чтобы различать, какие сеансы принадлежат какой учетной записи сервера.
Кроме того, значение gc_maxlifetime
никак не связан с отдельными сессиями — это глобальное значение, которое устанавливается заново каждый раз, когда запускается скрипт. Добавьте к этому тот факт, что PHP вызывает сессионный сборщик мусора, когда session_start
при вызове сценария другой учетной записи возможно удалить ваши сеансы в соответствии с любым значением gc_maxlifetime
они используют при вызове.
Единственный способ справиться с этим является размещение ваших сессий в отдельном каталоге. Даже тогда вам нужно убедиться, что gc_maxlifetime
устанавливается каждый раз, когда вызывается один из ваших собственных сценариев. В общем, это очень веская причина не использовать нативные сессии PHP, если это возможно. Пакеты как Сессионный модуль Laravel упростите развертывание альтернативных механизмов хранения сеансов, таких как memcache или database.
Других решений пока нет …