) 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.gc_maxlifetime
указывает количество секунд, по истечении которых данные будут рассматриваться как «мусор». 'и потенциально очищены. Сборка мусора может происходить во время запуска сеанса (в зависимости отsession.gc_probability
иsession.gc_divisor
).
На той же странице:
session.gc_divisor
в сочетании сsession.gc_probability
определяет вероятность того, что процесс gc (сборка мусора) запускается при каждой инициализации сеанса. Вероятность рассчитывается с использованиемgc_probability / gc_divisor
, например 1/100 означает, что существует вероятность 1%, что процесс сборки мусора запускается при каждом запросе.session.gc_divisor
по умолчанию 100.
Теперь посчитайте и убедитесь, что сборщик мусора вряд ли будет вызываться при каждом запросе.
Вы должны сохранить в сеансе переменную, которая сохраняет время последней активности пользователя, и использовать ее вместо того, чтобы сеанс был логически «активным». Не полагайтесь на сборку мусора.
Даже если сборщик мусора запустил и удалил файл сеанса, который вы открыли / прочитали с помощью session_start ()
, он НЕ проникнет внутрь этого конкретного процесса PHP и не удалит $ _ SESSION
объектный массив.
Предположим, вы используете стандартный файловый обработчик сеанса (который содержит копию serialize ()
d $ _ SESSION
), вот что происходит.
session_start ()
, в результате чего PHP открывает / блокирует файл, читает его содержимое, десериализует данные и, между прочим, может обновлять файлы сеанса. Отметка времени последнего использования (atime в 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, IF , сборщик мусора решит сработать. Однако, если вы не сделаете это в эту секунду session_start ()
, старые данные $ _SESSION из предыдущего вызова start () БУДУТ ПРИСУТСТВОВАТЬ .Файл сеанса мог быть удален, но сборщик мусора не коснется того, что находится в памяти вашего скрипта во время его выполнения.
Я не думаю, что так должен работать gc_maxlifetime
. В руководстве сказано, что
session.gc_maxlifetime задает количество секунд, по истечении которых данные будут рассматриваться как «мусор» и потенциально очищены.
(курсив мой)
в вашем случае сеанс все еще активен. Поэтому я не думаю, что он будет подлежать сборке мусора.
Вы можете попробовать выполнить session_write_close ()
перед сном (). Это может увеличить вероятность того, что сборщик мусора.
session.gc_maxlifetime - это количество секунд, после которого сессия будет рассматриваться для сборки мусора.
session.gc_probability и session.gc_divisor определяют вероятность того, что сборка мусора будет выполнена при любой инициализации сессии