PHP会话在会话Cookie过期之前注销

时间:2019-01-23 14:15:27

标签: php session cookies session-cookies

我将Cookie的生存期设置为一整天,但是在15-20分钟的空闲时间后,无论如何我都会注销。最奇怪的是,一切都可以在localhost上正常运行,但是当我上线我的网站时,我开始使用相同的确切代码遇到此问题。

我在stackoverflow上读到它可能与 session.gc_maxlifetime 有关,所以我什至在.htaccess级别上进行了编辑。我已将其从1440更改为86400,但问题仍然存在。

这是我的代码摘要。

当用户登录时,我检查用户是否已经有一个名为“ AUTHID”的cookie。如果用户这样做,我首先将其删除。

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

此后,取决于用户是否选择了“记住我”选项,我设置了cookie生存期值,并创建了一个cookie,我可以在Chrome设置中看到该cookie的时间完全正确。

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分钟,我的会话就会时间到。

编辑:从一篇文章中,我想到了每10分钟左右进行一次AJAX调用的想法,并且在打开浏览器时可以使用。但是,我需要一个即使浏览器关闭也可以使用的完整方法。

EDIT2:保持会话有效的AJAX代码:

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

1 个答案:

答案 0 :(得分:0)

一些注意事项:

  • 会话和ajax是一件棘手的事情。进行ajax调用时,请确保关闭会话,以便将更改写入会话。 (register_shutdown_function(“ session_write_close”);)

  • 在这种情况下,更改会话名没有实际用处(默认会这样做)。

  • AUTHID cookie存储与您的会话相对应的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();