Сценарий 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
), вот что происходит.
session_start()
, заставляя PHP открывать / блокировать файл, читать его содержимое, десериализовать данные и, кстати, возможно обновлять временную метку «последний использованный» файла сеанса (atime on Unix). Теперь, если вы сделали что-то вроде этого:
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 (). Это может увеличить вероятность того, что сборщик мусора.