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 секунд), script не должен распечатывать что-либо.
Тем не менее, я все еще получаю следующее сообщение
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.
Можете ли вы рассказать мне, как заставить его работать?
Спасибо
Ответы
Ответ 1
Даже если сборщик мусора запустил и удалил файл сеанса, который вы открыли/прочитали с помощью session_start()
, он НЕ попадет в кишки этого конкретного процесса PHP и удалит массив объектов $_SESSION
.
Предполагая, что вы используете стандартный обработчик сеанса на основе файлов (который содержит serialize()
'd копию $_SESSION
), вот что происходит.
- Файл сеанса находится в каталоге temp
- Вы
session_start()
, заставляя PHP открывать/блокировать файл, читать его содержимое, десериализовать данные и, кстати, возможно обновлять временную метку файла сеанса "last used" (atime on Unix).
- Если звезды и луна правильно выровнены с восходящим потоком Нептуна в пятом доме, сборщик мусора сессии МОЖЕТ запускать и удалять старые файлы сеанса.
- Сборщик мусора будет радостно перебирать каталог сеанса и удалять любые файлы старше 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, IF сборщик мусора решает нанести удар. Однако, если вы не сделаете эту вторую session_start()
, старые данные $_SESSION из previous start() call БУДЕТ ВСЕ ЕЩЕ ПРИСОЕДИНЕН. Возможно, файл сеанса был поврежден, но сборщик мусора не будет трогать то, что присутствует в вашей памяти script, когда он запускается.
Ответ 2
session.gc_maxlifetime - это количество секунд, после которого сеанс будет рассмотрен для сбора мусора.
session.gc_probability и session.gc_divisor затем определите вероятность того, что сбор мусора будет выполнен при любой инициализации сеанса
Ответ 3
Прочитайте manual (внимание мое):
session.gc_maxlifetime
указывает количество секунд, после которых данные будут отображаться как "мусор" и потенциально. Сбор мусора может произойти во время сеанса (в зависимости от session.gc_probability
и session.gc_divisor
).
На той же странице:
session.gc_divisor
в сочетании с session.gc_probability
определяет вероятность запуска процесса gc (сборка мусора) при каждой инициализации сеанса. Вероятность рассчитывается с использованием gc_probability/gc_divisor
, например. 1/100 означает, что существует вероятность 1% запуска процесса GC по каждому запросу. session.gc_divisor
по умолчанию - 100.
Теперь сделайте математику и убедитесь, что она не очень вероятна, что GC будет вызываться по каждому запросу.
Вы должны сохранить в сеансе переменную, которая сохраняет время последней активности пользователя и использует это, а не сеанс логически "активен". Не полагайтесь на сборку мусора.
Ответ 4
Я не думаю, что так должно работать gc_maxlifetime
. В руководстве говорится:
session.gc_maxlifetime указывает количество секунд, после которых данные будут отображаться как "мусор" и потенциально.
(акцент мой)
в вашем случае сессия все еще активна. Поэтому я не думаю, что это будет связано с сбором мусора.
Вы можете попробовать сделать session_write_close()
перед сном(). Это может увеличить вероятность того, что сборщик мусора.