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.

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

Спасибо

18
задан Community 5 October 2012 в 14:16
поделиться

4 ответа

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

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.

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

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

4
ответ дан 30 November 2019 в 06:22
поделиться

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

Предположим, вы используете стандартный файловый обработчик сеанса (который содержит копию serialize () d $ _ SESSION ), вот что происходит.

  1. Файл сеанса находится в своем временном каталоге
  2. You session_start () , в результате чего PHP открывает / блокирует файл, читает его содержимое, десериализует данные и, между прочим, может обновлять файлы сеанса. Отметка времени последнего использования (atime в 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, IF , сборщик мусора решит сработать. Однако, если вы не сделаете это в эту секунду session_start () , старые данные $ _SESSION из предыдущего вызова start () БУДУТ ПРИСУТСТВОВАТЬ .Файл сеанса мог быть удален, но сборщик мусора не коснется того, что находится в памяти вашего скрипта во время его выполнения.

37
ответ дан 30 November 2019 в 06:22
поделиться

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

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

(курсив мой)

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

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

1
ответ дан 30 November 2019 в 06:22
поделиться

session.gc_maxlifetime - это количество секунд, после которого сессия будет рассматриваться для сборки мусора.

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

9
ответ дан 30 November 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: