Подтвердить что ты не робот

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.

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

Спасибо

4b9b3361

Ответ 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() перед сном(). Это может увеличить вероятность того, что сборщик мусора.