Сессии PHP не продлевают срок действия файлов cookie при каждом запросе - PullRequest
11 голосов
/ 25 сентября 2010

Предполагается, что session_start () продлевает срок действия файла cookie идентификатора сеанса с помощью переменной session.gc_maxlifetime?

Мой сеанс.gc_maxlifetime занимает 24 минуты, а каждый сеанс живет только 24 минуты, независимо от дополнительной активности на сайте. Я получаю свою сессию, обновляю страницу, и время истечения не меняется. Это приводит к выходу из системы через 24 минуты после входа в систему, несмотря ни на что. Что-то не так с моей конфигурацией?

Ответы [ 3 ]

6 голосов
/ 16 февраля 2014

У меня тоже были проблемы с этим. Я думал, что каждый

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 не истечет, и нет необходимости увеличивать срок его действия. Этот файл cookie будет удален при закрытии браузера. Тогда мы ограничены только временем, которое истекает на стороне сервера.

У меня также были проблемы с тем, что я не мог продлить время сеанса PHP с помощью jQuery Ajax PING, потому что я установил время истечения для PHPSESSID в cookie. 0 решает все проблемы с непредвиденными окончаниями сеансов. Извините за мой английский. Удачи.

3 голосов
/ 02 апреля 2013

Я заметил такое поведение в PHP и попробовал каждую конфигурацию на PHP, но пока не повезло.

Мои сеансы умирали в точное время с первого session_start(), посмотрите на время жизни куки, это не былопродление срока его действия.

У моего приложения уже есть важный счетчик клиентов, около 60 соединений в секунду, поэтому GC срабатывает каждые 1,5 с (я полагаю).

Мое решение для времени cookieне расширение было что-то вроде этого (это может показаться не элегантным, но сработало для меня).

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 идентификатора сессии".Не может быть оптимальным, но на самом деле это работает для меня!

3 голосов
/ 25 сентября 2010

Я думаю, что этот пост предоставит решение, которое вы ищете: Тайм-ауты сеансов в PHP: лучшие практики

Обычно, когда вызывается session_start(), существует вероятность 1% (по умолчанию), что сборщик мусора будет запущен. При запуске сборщика мусора он сканирует и удаляет просроченные сеансы. Однако, когда вы являетесь единственным пользователем, обращающимся к странице (которым вы, вероятно, пользуетесь при разработке), или если пользователей очень мало, сборщик мусора будет работать только при доступе к странице. Это происходит ПОСЛЕ вызова session_start(), эффективно сбрасывающего таймер. Вместо того, чтобы пытаться обойти это, просто внедрите свою собственную функцию session_start(), которая устанавливает время ожидания. Попробуйте функцию, которую выложил @Glass Robot, по ссылке, которую я вам дал выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...