Я написал этот код для управления сеансами, чтобы они заканчивались, когда браузер закрыт, или если пользователь неактивен в течение определенного времени (2 часа). Однако кажется, что сеансы заканчиваются после 40 минут бездействия, и я действительно не понимаю, как это возможно. Если мой код не работает, я ожидаю, что он должен продлиться 1440 секунд (24 минуты).PHP-сессия, истекающая через 40 минут
define("MY_SESSION", "mysession");
define("SESSION_DURATION", 7200);
function my_session_start() {
if (session_status() != PHP_SESSION_NONE)
return;
ini_set('session.gc_maxlifetime', SESSION_DURATION);
ini_set('session.cookie_lifetime', 0);
session_set_cookie_params(0);
session_name(MY_SESSION);
session_start();
if ((!isset($_SESSION['EXPIRES'])) || ($_SESSION['EXPIRES'] < time())) {
$_SESSION = array();
session_unset();
session_destroy();
session_start();
}
$_SESSION['EXPIRES'] = time() + SESSION_DURATION;
if (isset($_SESSION['REGENERATE'])) {
$_SESSION['REGENERATE']++;
if ($_SESSION['REGENERATE'] >= mt_rand(90,100)) {
$_SESSION['REGENERATE'] = 0;
session_regenerate_id(true);
}
}
else {
$_SESSION['REGENERATE'] = 0;
session_regenerate_id(true);
}
}
Я поместил my_session_start()
в каждый файл PHP. Я на общем сервере, но ini_set()
не заблокирован, и, запустив phpinfo()
после my_session_start()
, я вижу, что локальное значение session.gc_maxlifetime
установлено на 7200 (тогда как главное значение равно 1440). session.gc_probability
и session.gc_divisor
оставлены по умолчанию (соответственно 1 и 100). Я также регенерирую идентификаторы сеансов на случайной основе из 90-100 загрузок страниц/звонков AJAX, но это не имеет значения, так как я попытался также прокомментировать эту часть, и это не решило проблему.
Итак, я что-то не так с моим кодом? Откуда берутся эти минуты, я имею в виду, почему 40 минут?
Проверьте этот ответ на [как истекает PHP сессии после 30m] [1]. [1]: http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes – Alberto
Это почти то, что я делаю с мой код и проблема, безусловно, не связаны с делителем и вероятностью, так как я пытался как минимум 5 раз: 39 минут бездействия -> сеанс живой, 41 минута бездействия -> мертвая сессия. Все еще интересно, почему и почему 40 минут – Fabius