session_start()是否应该通过session.gc_maxlifetime变量延长会话ID cookie的生命周期?
我的session.gc_maxlifetime是24分钟,每个会话只有24分钟,无论网站上的其他活动如何。我得到我的会话,刷新页面,并且到期时间不会改变。这导致在登录24分钟后退出,无论如何。我的配置有问题吗?
答案 0 :(得分:6)
我也有这个问题。我在想每一个
session_set_cookie_params($sessionTime, '/', $domain);
session_start();
导致cookie PHPSESSID的到期时间延长。但实际上,当生成新会话ID时,cookie {PHPESSID'仅在会话中第一次设置为session_start()
。
我的目标是每次打开页面时都会重新生成会话到期时间。我发现会话可能会因为两个原因而过期:
session_start()
重新生成,因此会话将因Cookie过期时间而过期。ini_set('session.gc_maxlifetime', $sessionTime)
设置。在这种情况下的解决方案是,您不会设置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”。可能不是最佳,但它确实对我有用!