Intereting Posts

PHP – ini_set ('session.gc_maxlifetime', 5) – Почему он не заканчивает сеанс?

Сценарий PHP выглядит следующим образом:

<?php // continue.php ini_set('session.gc_maxlifetime', 5); session_start(); echo ini_get('session.gc_maxlifetime'); // wait for 7 seconds usleep(7000000); if (isset($_SESSION['username'])) { $username = $_SESSION['username']; $password = $_SESSION['password']; $forename = $_SESSION['forename']; $surname = $_SESSION['surname']; echo "Welcome back $forename.<br /> Your full name is $forename $surname.<br /> Your username is '$username' and your password is '$password'."; } else echo "Please <a href=authenticate2.php>click here</a> to log in."; ?> 

Основываясь на тайм-ауте (т.е. 5 секунд), сценарий не должен распечатывать что-либо. Тем не менее, я все еще получаю следующее сообщение

 5Welcome back Bill. Your full name is Bill Smith. Your username is 'bsmith' and your password is 'mysecret'. 

Кажется, что строка ini_set ('session.gc_maxlifetime', 5) не работает должным образом. Я использую windowsXP + XAMMP.

Можете ли вы рассказать мне, как заставить его работать?

спасибо

Даже если сборщик мусора запустил и удалил файл сеанса, который вы открыли / прочитали с помощью session_start() , он НЕ попадет в кишки этого конкретного процесса PHP и удалит массив объектов $_SESSION .

Предполагая, что вы находитесь на стандартном обработчике сеанса на основе файлов (который содержит serialize() копию копии $_SESSION ), вот что происходит.

  1. Файл сеанса находится в своем временном каталоге
  2. Вы session_start() , заставляя PHP открывать / блокировать файл, читать его содержимое, десериализовать данные и, кстати, возможно обновлять временную метку «последний использованный» файла сеанса (atime on Unix).
  3. Если звезды и луна правильно совпадают с восходящим потоком Нептуна в пятом доме, сборщик мусора сессии МОЖЕТ запускать и удалять старые файлы сеанса.
  4. Сборщик мусора будет радостно перебирать каталог сеанса и удалять любые файлы, которые старше, чем max_liftime, но НЕ УДАЛИТЬ ЛЮБЫЕ ФАЙЛЫ, НАСТОЯЩИЕ ОТКРЫТЫ / ИСПОЛЬЗУЕМЫ . Поскольку вы не закрыли () в своей сессии, файл сеанса все еще используется, поэтому его не удалять.

Теперь, если вы сделали что-то вроде этого:

 ini_set(...); // set GC probability to max, short session lifetime, etc... session_start(); // populate $_SESSION session_write_close(); // dump $_SESSION out to file, close file, release lock. sleep(7); // Sleep for 7 seconds; session_start(); // re-populate $_SESSION; 

Теперь вы можете просто получить свежую пустую $ _SESSION, ЕСЛИ сборщик мусора решает нанести удар. Однако, если вы не сделаете этот второй session_start() , старые данные $ _SESSION из предыдущего вызова start () WILL STILL BE PRESENT . Возможно, файл сеанса был поврежден, но сборщик мусора не будет трогать то, что присутствует в памяти вашего скрипта, когда он запускается.

session.gc_maxlifetime – это количество секунд, после которых сессия будет рассмотрена для сбора мусора.

session.gc_probability и session.gc_divisor, затем определите вероятность того, что сбор мусора будет выполняться при любой инициализации сеанса

Прочтите руководство (основное внимание):

session.gc_maxlifetime указывает количество секунд, после которых данные будут считаться «мусором» и потенциально очищены. Сбор мусора может произойти во время сеанса (в зависимости от session.gc_probability и session.gc_divisor ).

На той же странице:

session.gc_divisor сочетании с session.gc_probability определяет вероятность запуска процесса gc (сборка мусора) при каждой инициализации сеанса. Вероятность вычисляется с использованием gc_probability/gc_divisor , например, 1/100 означает, что вероятность каждого процесса GC начинается с 1%. session.gc_divisor умолчанию – 100.

Теперь сделайте математику и посмотрите, что не очень вероятно, что GC будет вызван по каждому запросу.

Вы должны сохранить в сеансе переменную, которая сохраняет время последнего действия пользователя и использует это, а не сеанс логически «активен». Не полагайтесь на сборку мусора.

Я не думаю, что gc_maxlifetime должно работать gc_maxlifetime . В руководстве говорится

session.gc_maxlifetime указывает количество секунд, после которых данные будут считаться «мусором» и потенциально очищены.

(акцент мой)

в вашем случае сеанс по-прежнему активен. Поэтому я не думаю, что это будет связано с сбором мусора.

Вы можете попробовать выполнить session_write_close() перед sleep (). Это может увеличить вероятность того, что сборщик мусора.