PHP сессия истечение - PullRequest
       1

PHP сессия истечение

3 голосов
/ 03 сентября 2010

Вопрос относительно истечения срока действия сеанса в PHP.

Мне нужен мой сервер, чтобы выбрасывать информацию о сеансе, если этот пользователь какое-то время неактивен (для целей тестирования - 5 секунд).

Я смотрел на этот вопрос и, в частности, на ответ Гамбо (+28 голосов), и мне было интересно узнать о возможности этого ответа в отношении неактивных пользователей.На моем сайте я уже реализовал это предложение, и оно отлично работает, пока пользователь запрашивает некоторые данные хотя бы один раз после истечения сеанса.Но проблема с неактивными пользователями заключается в том, что они не запрашивают новые данные.Таким образом, код срока действия никогда не вызывается.

Я смотрел на session.gc_maxlife и связанные параметры в моем PHP.ini, но я не мог заставить это работать так, как я хотел.

Есть предложения по этой проблеме?

Ответы [ 4 ]

3 голосов
/ 03 сентября 2010

Логика истечения срока действия , о которой я упоминал , уже делает то, что вы ожидали: сеанс нельзя использовать после истечения срока его действия.

То, что данные сеанса все еще находятся в хранилище, не имеет значения, поскольку их нельзя использовать после истечения срока действия; он будет удален при следующем запуске сборщика мусора. И это происходит с вероятностью session.gc_probability , деленной на session.gc_divisor при каждом вызове session_start (см. Также Как долго продлится мой сеанс? ).


Редактировать Поскольку вы хотите выполнить некоторые дополнительные задачи в сеансе с истекшим сроком действия, я бы скорее рекомендовал использовать пользовательский обработчик сохранения сеанса .

При использовании класса для обработчика сохранения сеанса вы можете написать два класса: один для базового обработчика сохранения и один с расширенным сборщиком мусора, который выполняет дополнительные задачи, например ::

interface SessionSaveHandler {
    public function open();
    public function close();
    public function read($id)
    public function write($id, $data);
    public function destroy($id);
    public function gc($callback=null);
}
class SessionSaveHandler_WithAdditionalTasks implements SessionSaveHandler {
    // …
    public function gc($callback=null) {
        if (!is_null($callback) && (!is_array($callback) || !is_callable($callback))) return false;
        while (/* … */) {
            if ($callback) $callback[0]::$callback[1]($id);
            // destroy expired sessions
            // …
        }
    }
    public static function doAdditionalTasksOn($id) {
        // additional tasks with $id
    }
}
session_set_save_handler(array('SessionSaveHandler_DB_WithAdditionalTasks', 'open'),
                         array('SessionSaveHandler_DB_WithAdditionalTasks', 'close'),
                         array('SessionSaveHandler_DB_WithAdditionalTasks', 'read'),
                         array('SessionSaveHandler_DB_WithAdditionalTasks', 'write'),
                         array('SessionSaveHandler_DB_WithAdditionalTasks', 'destroy'),
                         array('SessionSaveHandler_DB_WithAdditionalTasks', 'gc')
                         );
1 голос
/ 03 сентября 2010

Один из способов сделать это - использовать javascript, чтобы обновить страницу немного по истечении времени ожидания. Пусть ваши пользователи должны будут включить Javascript, чтобы это работало. Вы также можете добавить дополнительные функции, такие как отображение всплывающего окна с сообщением о тайм-ауте с обратным отсчетом и т. Д. Так важно, что происходит, если сеанс истекает из-за ваших настроек, затем происходит обновление, выполнение очистки и выполнение.

<html>
<head>
<script type="text/JavaScript">
<!--
function timedRefresh(timeoutPeriod) {
    setTimeout("location.reload(true);",timeoutPeriod);
}
//   -->
</script>
</head>
<body onload="JavaScript:timedRefresh(5000);">
</body>
</html>
1 голос
/ 03 сентября 2010

Если вам нужно вызвать определенную логику истечения срока действия (например, для обновления базы данных) и получить независимость от запросов, то имеет смысл реализовать демон внешнего обработчика сеансов, который просматривает время доступа к файлам сеансов. сценарий демона должен выполнять все необходимое для каждого файла сеанса, к которому не обращались в течение указанного времени.

Это решение имеет две предпосылки: файловая система сервера поддерживает время доступа (Windows не поддерживает), и вы можете читать файлы из путь сохранения сеанса .

1 голос
/ 03 сентября 2010

Сборщик мусора не вызывается для сеанса, сборщик мусора должен вызываться на основе значений tge gc_ *, которые могут сделать недействительными несколько сеансов. Так что, пока кто-то вызывает его, другие люди могут выйти из системы. Если вам нужен более надежный метод, если ваш тайм-аут в минутах, используйте cronjob, если ваш тайм-аут в секундах, вам придется использовать какой-то процесс демона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...