Как мне закончить сеанс PHP через 30 минут?

Следуя идее Адама. Сделайте свой подготовленный оператор вроде select my_column из my_table, где search_column in (#) Создайте строку x и заполните ее числом «?,?,?» в зависимости от вашего списка значений. Затем просто измените # в запросе на новую строку String x наполнитель

1000
задан Mob 13 October 2011 в 07:38
поделиться

3 ответа

Вы должны установить собственный тайм-аут сеанса. Оба варианта, упомянутые другими ( session.gc_maxlifetime и session.cookie_lifetime ), не являются надежными. Я объясню причины этого.

Во-первых:

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

Но сборщик мусора запускается только с вероятностью session.gc_probability , деленной на session.gc_divisor . А используя значения по умолчанию для этих опций (1 и 100 соответственно), вероятность составляет всего 1%.

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

Более того, при использовании файлов PHP по умолчанию session.save_handler , данные сеанса сохраняются в файлах по пути, указанному в session.save_path . С этим обработчиком сеанса возраст данных сеанса рассчитывается на дату последнего изменения файла, а не на дату последнего доступа:

Примечание: Если вы используете обработчик сеанса на основе файлов по умолчанию, ваша файловая система должна сохранять отслеживание времени доступа (atime). Windows FAT не работает, поэтому вам придется придумать другой способ обработки сборки мусора в вашем сеансе, если вы застряли в файловой системе FAT или любой другой файловой системе, где отслеживание времени недоступно. Начиная с PHP 4.2.3 вместо atime используется mtime (дата изменения). Итак, ты выиграл У них есть проблемы с файловыми системами, где отслеживание времени недоступно.

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

И второе. :

session.cookie_lifetime
session.cookie_lifetime указывает время жизни cookie в секундах, которое отправляется в браузер. […]

Да, верно. Это влияет только на время жизни cookie, и сам сеанс может оставаться действительным. Но задача сделать сессию недействительной - это задача сервера, а не клиента. Так что это ничего не помогает. Фактически, если для параметра session.cookie_lifetime установлено значение 0 , файл cookie сеанса станет настоящим файлом cookie сеанса , действительным только до закрытия браузера.

Заключение / лучшее решение:

Лучшее решение - установить собственный тайм-аут сеанса. Используйте простую метку времени, которая обозначает время последнего действия (например, запроса), и обновляйте ее с каждым запросом:

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

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

Вы также можете использовать дополнительную метку времени для периодической регенерации идентификатора сеанса, чтобы избежать атак на сеансы, например фиксация сеанса :

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // session started more than 30 minutes ago
    session_regenerate_id(true);    // change session ID for the current session and invalidate old session ID
    $_SESSION['CREATED'] = time();  // update creation time
}

Примечания:

  • session.gc_maxlifetime должно быть по крайней мере равным времени жизни этого настраиваемого обработчика истечения срока (1800 в этом примере);
  • , если вы хотите завершить сеанс через 30 минут активности вместо 30 минут , поскольку начало , ты » Мне также потребуется использовать setcookie с истечением срока действия time () + 60 * 30 , чтобы файл cookie сеанса оставался активным.
1627
ответ дан 19 December 2019 в 20:20
поделиться

Это должно зарегистрировать пользователя после времени набора? Установка времени создания сессии (или времени истечения), когда это регистрируется, и затем проверяя, который на каждой загрузке страницы мог обработать это.

Например:

$_SESSION['example'] = array('foo' => 'bar', 'registered' => time());

// later

if ((time() - $_SESSION['example']['registered']) > (60 * 30)) {
    unset($_SESSION['example']);
}

Править: У меня есть чувство Вы означать что-то еще все же.

Можно фрагментировать сессии после определенной продолжительности жизни при помощи session.gc_maxlifetime установка ini:

Править: ini_set ('сессия gc_maxlifetime', 60*30);

39
ответ дан Ted Cohen 13 October 2011 в 18:38
поделиться
  • 1
    @fmt. Println. MKO - благодарит за всю Вашу справку по этому вопросу – Jason 30 June 2013 в 08:47
if (isSet($_SESSION['started'])){
    if((mktime() - $_SESSION['started'] - 60*30) > 0){
        //Logout, destroy session, etc.
    }
}
else {
    $_SESSION['started'] = mktime();
}
14
ответ дан Peter Mortensen 13 October 2011 в 18:38
поделиться
Другие вопросы по тегам:

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