PHP会话不会在每个请求上延长Cookie过期时间

时间:2010-09-24 23:11:51

标签: php session

session_start()是否应该通过session.gc_maxlifetime变量延长会话ID cookie的生命周期?

我的session.gc_maxlifetime是24分钟,每个会话只有24分钟,无论网站上的其他活动如何。我得到我的会话,刷新页面,并且到期时间不会改变。这导致在登录24分钟后退出,无论如何。我的配置有问题吗?

3 个答案:

答案 0 :(得分:6)

我也有这个问题。我在想每一个

session_set_cookie_params($sessionTime, '/', $domain);
session_start();

导致cookie PHPSESSID的到期时间延长。但实际上,当生成新会话ID时,cookie {PHPESSID'仅在会话中第一次设置为session_start()

我的目标是每次打开页面时都会重新生成会话到期时间。我发现会话可能会因为两个原因而过期:

  1. Cookie PHPSESSID过期,其到期时间不会由session_start()重新生成,因此会话将因Cookie过期时间而过期。
  2. 用户的任何活动都不会导致该会话在服务器端过期。它由ini_set('session.gc_maxlifetime', $sessionTime)设置。
  3. 在这种情况下的解决方案是,您不会设置Cookie的到期时间,但仍设置session.gc_maxlifetime

    function my_session_start($maxtime = 300)
    {
        ini_set('session.gc_maxlifetime', $maxtime);
        session_set_cookie_params(0, '/', "." . $domain);
        session_start();
    }
    

    最重要的是0中的session_set_cookie_params(0, '/', "." . $domain),然后Cookie不会过期,也不需要延长其到期时间。浏览器关闭时,将删除此cookie。然后我们仅限于服务器端到期的时间。

    我还遇到问题,我无法通过jQuery Ajax PING扩展PHP会话时间,因为我已经在cookie中设置了PHPSESSID的到期时间。 0解决了预期会话结束的所有问题。对不起我的英语不好。祝你好运。

答案 1 :(得分:3)

我认为这篇文章将提供您正在寻找的解决方案:Session timeouts in PHP: best practices

基本上,当调用session_start()时,垃圾收集器将运行的概率为1%(默认情况下)。当垃圾收集器运行时,它会扫描并删除过期的会话。但是,当您是访问该页面的唯一用户(在开发期间可能是您的用户)或用户非常少时,垃圾收集器将仅在您访问页面时运行。调用session_start()后会发生这种情况,从而有效地重置计时器。不要试图解决这个问题,而是实现自己的session_start()函数来强制执行超时。在我上面给你的链接中尝试@Glass Robot发布的功能。

答案 2 :(得分:3)

我在PHP中注意到了这种行为并尝试了PHP上的所有配置,但到目前为止还没有运气。

我的会话在第一次session_start()的确切时间内死亡,看看Cookie的生命周期,它没有续订到期时间。

我的应用程序已经有一个重要的客户端数量,大约每秒60个连接,所以GC每1.5秒就会命中一次(我猜)。

我的cookie时间没有扩展的解决方案是这样的(它可能看起来不优雅,但对我有用)。

function my_session_start($maxtime = 300){
    // $maxtime = 300 for 5 minutes
    session_start();
    $_sess_name = session_name();
    $_sess_id = session_id();
    // Update cookie ;)
    setcookie($_sess_name, $_sess_id, time() + $maxtime, "/");
}

这是我的特殊解决方案,因为问题是“会话ID cookie”。可能不是最佳,但它确实对我有用!