PHP сессия выходит из системы до истечения срока действия куки - PullRequest
0 голосов
/ 23 января 2019

Я настроил время жизни куки на полный день, но после 15-20 минут простоя я все равно выхожу из системы. Самое странное, что на localhost все работает нормально, но когда я запустил свой веб-сайт, я начал испытывать эту проблему с точно таким же кодом.

Я прочитал в stackoverflow, что это может быть связано с session.gc_maxlifetime , поэтому я даже отредактировал это на уровне .htaccess. Я изменил его с 1440 на 86400, но проблема все еще сохраняется.

Вот краткое изложение моего кода.

Когда пользователь входит в систему, я проверяю, есть ли у пользователя файл cookie с именем «AUTHID». Если пользователь это делает, я сначала его удаляю.

if (isset($_COOKIE['AUTHID'])) {
        unset($_COOKIE['AUTHID']);
        setcookie('AUTHID', null, -1, '/');
    }

После этого, в зависимости от того, выбрал ли пользователь опцию «Запомнить меня», я устанавливаю значение времени жизни файла cookie, и оно создает файл cookie, который я вижу в настройках Chrome с абсолютно правильным сроком действия.

session_name('AUTHID');
ini_set('session.cookie_httponly', 1);

if(isset($_POST['remember-me'])) {
    ini_set('session.gc_maxlifetime', 604800);
    session_set_cookie_params(604800,"/");
} else {
    ini_set('session.gc_maxlifetime', 86400);
    session_set_cookie_params(86400,"/");
}

session_start();

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

$rel_url = "$_SERVER[REQUEST_URI]";
session_name('AUTHID');
session_start();
if(!isset($_SESSION['user_id'])) {
    if (strpos($rel_url, 'login=success') !== false) {
        header('Location: index.php');  
    }
    header('Location: login-with-bg.php?access-denied=logged-out');
    exit();
} 

Это прекрасно работает на моем локальном хосте, но когда я загрузил этот код на свой хост-сервер, хотя cookie все еще создается с правильной датой истечения срока, но если мой браузер простаивает в течение 15-20 минут, мой сеанс получает время вышло.

РЕДАКТИРОВАТЬ: из статьи у меня появилась идея делать AJAX-вызовы каждые 10 минут или около того, и это работает, когда браузер открыт. Однако мне нужен полный метод, который работает, даже если браузер закрыт.

EDIT2: код AJAX, который у меня есть для поддержания сеанса:

function keep_alive() {
    $.get('index.php',null)
}
keep_alive_interval = setInterval(keep_alive, 600000)

1 Ответ

0 голосов
/ 23 января 2019

Несколько заметок:

  • Сессия и AJAX - сложная вещь. Обязательно закройте сеанс при выполнении вызова ajax, чтобы он записывал изменения в ваш сеанс. (Register_shutdown_function ( "session_write_close");)

  • В этом случае нет никакого реального смысла в изменении имени сеанса (по умолчанию будет).

  • Файл cookie AUTHID хранит ваш session_id, соответствующий вашему сеансу. Это должно быть установлено также. Не нужно вручную устанавливать cookie

Это работает для меня на сервере, но не на локальных машинах

if ($_SERVER['SERVER_ADDR'] != '127.0.0.1'){ // Only use custom session on server. use default settings on local machine

    register_shutdown_function("session_write_close"); // write your changes done with ajax before your session opens again

    // some security settings
    ini_set("session.use_strict_mode", 1);
    ini_set("session.cookie_httponly", 1);
    ini_set("session.cookie_secure", 1);
    ini_set("session.use_only_cookies", 1);

    ini_set("session.gc_maxlifetime",60 * 60 * 24 * 14); // 2 weeks
    session_set_cookie_params(60 * 60 * 24 * 14,"/",".yourdomain.com"); // 2 weeks

    session_name("AUTHID");
    if(isset($_COOKIE['AUTHID'])){
       session_id($_COOKIE['AUTHID']);
    }
}
session_start(); 
...