Сеансы PHP не продлевают срок действия Cookie на каждом запросе

Предполагается ли 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() только в первый раз в сеансе, когда генерируется новый идентификатор сеанса.

Моя цель заключалась в том, что время окончания сеанса должно восстанавливаться при каждом открытии страницы. Я понял, что сессия может закончиться по двум причинам:

  1. Cookie PHPSESSID истекает, и его срок действия не восстанавливается session_start() , поэтому сеанс всегда истекает из-за cookie с истечением срока действия.
  2. Никакая активность пользователя не приведет к истечению срока действия сеанса на стороне сервера. Он устанавливается 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 идентификатора сеанса». Не может быть оптимальным, но он действительно работает для меня!