Продлевается ли жизнь сессии при каждом session_start()?

Имеется сайт, на котором постоянно дёргается сессия вызовом session_start() для получения каких-либо данных. В php.ini жизнь сессии установлено на 1 час. Меня интересует, как работает сборщик мусора. Он считает время от создания сессии или от последнего её использования?

Потому что спустя час создания сборщик мусора удаляет все сессии, даже если они постоянно вызвались. Не пойму в чём проблема, в коде или в работе сборщика.
  • Вопрос задан
  • 659 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
Вообще да, продлевается.
Возможно их удаляет чей-то чужой сборщик мусора, как в этой истории.

tl;dr: Значение session.gc_maxlifetime можно переопределять в рантайме. И сборщик мусора удаляет все просроченные сессии из session.save_path. Если несколько разных приложений используют общую директорию session.save_path, можно наблюдать спецэффекты.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@DezzmonD
1) Когда сессия стартует создаётся переменная $_SESSION, и после этого есть шанс что запуститься сборщик мусора который удалит все файлы по пути session.save_path у которых "updated_time" < (cuttent_time - "session.gc_maxlifetime"). ВАЖНО: время жизни куки с ID сессии не обновляется!!!
Сборщик мусора запускается с шансом "session.gc_probability" / "session.gc_divisor" (по умолчанию это обычно: 1 / 1000 = 0.001%) при каждом запуски сессии;

2) Да, когда стартует сессия PHP берёт ID с куки, ищет файл сессии в ession.save_path с таким ID, и обновляет его "updated_time".

Решение твоей проблемы:
1) Проверь сколько у тебя стоит время жизни куки "session.cookie_lifetime".
Ты мог обновлять страницу сколько угодно, но попросту прошло время жизни куки. Если это так, то поставь 0 (до закрытия браузера) - это если тебе нужно после каждого запуска сессии время обновлялось. Тогда сессия будет жить session.gc_maxlifetime

2) Если это не первый вариант то это означает разные скрипты используют 1 папку session.save_path для хранения файлов сессии. Смените папку session.save_path с помощью ini_set() или обратитесь к хостеру.

P.S. Так же я рекомнедую использовать session_name(). Это поможет избежать ошибок если вы захотите хранить несколько сессий для разных целей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы