即使在关闭浏览器或在 PHP 中闲置一段时间后返回后,如何保持用户会话处于活动状态?
P粉826429907
P粉826429907 2023-09-03 08:53:53
[MySQL讨论组]

在我的代码中,我可以选择“记住我”,选中后会将电子邮件和密码的值保存在 cookie 中,并且 cookie 持续 1 个月,现在,当用户再次进入页面时,会话它不是保持活动状态,而是从保存的 cookie 中获取值并将其显示在登录表单上。 我目前正在使用 cloudflare 和托管,我已经尝试建立这些代码行:

php_value session.cookie_lifetime 2629800;
php_value session.gc_maxlifetime 2629800;

都在 php.ini 和 .htacces 中,但结果是相同的(当用户关闭浏览器时,会话将关闭)。

这是 loginUser 函数,它处理登录并在用户选中“记住我”时创建 cookie,我想要的是,通过选中“提醒我”,即使用户关闭浏览器或在一段时间后返回,会话仍保持活动状态不活动时间,但会话持续时间为 1 个月(2629800 秒)。

function loginUser($email, $password, $rememberme)
{
    $mysqli = connect();
    $email = trim($email);
    $password = trim($password);
    
    if ($email == "" || $password == "") {
        return 'Both fields are required';
    }

    $email = filter_var($email, FILTER_SANITIZE_EMAIL);
    $password = filter_var($password, FILTER_SANITIZE_SPECIAL_CHARS);
    
    $sql = "SELECT * FROM users WHERE email = ? LIMIT 1";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param("s", $email);
    $stmt->execute();
    $result = $stmt->get_result();
    $data = $result->fetch_assoc();

    if ($data == NULL) {
        return 'The email does not exist, sign up to enter';
    }

    if (password_verify($password, $data["password"]) == FALSE) {
        return 'The password is incorrect, please check and try again';
    } else {
        $user_id = $data['user_id'];
        $_SESSION['auth_user_id'] = $user_id;
        $_SESSION["user"] = $email;
        $_SESSION["pass"] = $password;
        $_SESSION["username"] = $data['username'];
        $_SESSION["verify"] = $data['verify'];
        $_SESSION["profile"] = $data['profileImage'];
        $_SESSION["id"] = $data['user_id'];
        $_SESSION["vip"] = $data['vip'];

        setcookie('user_id', $data['user_id'], time() + 60 * 60 * 24 * 30, '/');

        if ($rememberme) {
            $cookie_name = 'Remember_US';
            $cookie_value = json_encode(array('lemail' => $email, 'lpassword' => $password));
            $cookie_expire = time() + (60 * 60 * 24 * 30);
            setcookie($cookie_name, encrypt($cookie_value), $cookie_expire, '/', null, true, true);
        }
        header("location: index.php");
        exit();
    }
}

PS:我知道这是重复的,但上面的问题都没有解决我的问题。

我再次提到,我尝试在 htaccess 和 php.ini 中设置这些行,但没有成功:

php_value session.cookie_lifetime 2629800;
php_value session.gc_maxlifetime 2629800;

//In functions.php
$expire = 60*60*24*30; // We choose a one year duration
ini_set('session.gc_maxlifetime', $expire);
session_start();

还值得一提的是,通过在关闭浏览器并重新打开浏览器时建立代码行,会话保持活动状态,但最多只能持续 2 小时。

P粉826429907
P粉826429907

全部回复(1)
P粉549986089

TL;DR setcookie 生命周期与 $_SESSION 的默认 PHPSESSID cookie 生命周期相混淆>.

要使 $_SESSION 遵守所需的生命周期,必须更新其 PHPSESSID cookie,将 cookie_lifetime 从默认值更改为一个月。这涉及手动管理 $_SESSION。以下是手动管理 $_SESSION 的示例工作流程:

  1. 设置session_name。 (可以设置 PHPSESSID 的替代 cookie 名称。)
  2. 配置会话选项。 (这可以包括设置 cookie_lifetime.)
  3. 创建和/或设置 session_id。
  4. 启动会话。 (此步骤根据 session_id 填充 $_SESSION。)
  5. 验证会话。 (检查session_id等认证参数是否有效。)
  6. 访问和修改 $_SESSION 值。
  7. 关闭会话。 (在将 session_id 发送到客户端之前阻止 $_SESSION 进行进一步更改。)

会话管理基础知识上的此链接应该乐于助人。您还可以阅读PHP 会话固定/劫持

在评论中,RiggsFolly 提供了值得思考的建议,Chris Haas 发布了一个很好的参考。像参考文献这样的解决方案似乎建议存储一个随机字符串作为用户查找密钥,并存储一个更长的散列字符串以进行验证。查找和非哈希验证字符串将使用 setcookie,而其他值可以使用 $_SESSION

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号