Предполагается ли session_start () продлить срок действия файла cookie идентификатора сеанса переменной session.gc_maxlifetime?
Мое session.gc_maxlifetime составляет 24 минуты, и каждый сеанс работает только 24 минуты независимо от дополнительной активности на сайте. Я получаю сеанс, обновляю страницу, и время истечения срока действия не изменяется. Это приводит к выходу из системы после 24 минут входа, несмотря ни на что. Что-то не так с моей конфигурацией?
Я думаю, что этот пост обеспечит решение, которое вы ищете: тайм-ауты сеанса в PHP: лучшие практики
В принципе, когда вызывается session_start()
, вероятность 1% (по умолчанию) заключается в том, что сборщик мусора будет запущен. Когда сборщик мусора запускается, он сканирует и удаляет истекшие сеансы. Однако, когда вы являетесь единственным пользователем, который обращается к странице (которой вы, вероятно, в процессе разработки) или очень мало пользователей, сборщик мусора будет работать только при доступе к странице. Это происходит после вызова session_start()
, эффективно сбросив таймер. Вместо того, чтобы пытаться обойти это, просто выполните свою собственную функцию session_start()
которая обеспечивает тайм-аут. Попробуйте функцию, которую опубликовал @Glass Robot
, в ссылке, которую я вам дал выше.
У меня тоже была проблема с этим. Я думал, что каждый
session_set_cookie_params($sessionTime, '/', $domain); session_start();
вызывает продление срока действия файла cookie PHPSESSID. Но на самом деле cookie PHPSESSID устанавливается session_start()
только в первый раз в сеансе, когда генерируется новый идентификатор сеанса.
Моя цель заключалась в том, что время окончания сеанса должно восстанавливаться при каждом открытии страницы. Я понял, что сессия может закончиться по двум причинам:
session_start()
, поэтому сеанс всегда истекает из-за cookie с истечением срока действия. ini_set('session.gc_maxlifetime', $sessionTime)
. Решение в этом случае – это когда вы не укажете время истечения срока действия cookie, но session.gc_maxlifetime
все еще установлено:
function my_session_start($maxtime = 300) { ini_set('session.gc_maxlifetime', $maxtime); session_set_cookie_params(0, '/', "." . $domain); session_start(); }
Наиболее важным является 0
в session_set_cookie_params(0, '/', "." . $domain)
тогда cookie не истекает, и нет необходимости продлевать срок его действия. Этот куки-файл будет удален при закрытии браузера. Тогда мы ограничены только временем, которое истекает на стороне сервера.
У меня также были проблемы с тем, что я не мог продлить время сеанса PHP с помощью jQuery Ajax PING, потому что я установил время истечения срока действия для PHPSESSID в cookie. 0
разрешает все проблемы с ожидаемыми концами сеансов. Извините за мой английский. Удачи.
Я заметил это поведение в PHP и пробовал каждую конфигурацию на PHP, но пока не повезло.
Мои сеансы умирали в точное время от первого session_start()
, смотрели на время жизни печенья, это не продлевало срок его действия.
У моего приложения уже есть важный счетчик клиентов, около 60 подключений в секунду, поэтому GC был поражен каждые 1,5 секунды (я думаю).
Мое решение о том, что время для печенья не распространяется, было чем-то вроде этого (может показаться, что это не элегантно, а работало для меня).
function my_session_start($maxtime = 300){ // $maxtime = 300 for 5 minutes session_start(); $_sess_name = session_name(); $_sess_id = session_id(); // Update cookie ;) setcookie($_sess_name, $_sess_id, time() + $maxtime, "/"); }
Это мое особое решение, поскольку в этом вопросе говорится «cookie идентификатора сеанса». Не может быть оптимальным, но он действительно работает для меня!