如何保持延长会话生活,当用户处于活动状态?(How to keep extending sessio

2019-07-30 22:40发布

比方说,有一个网站/系统在会员区已登录,而用户很少,但非常不便退出与网站/系统工作一段时间。

这是怀疑的会话过期,因为用户没有闲置很长时间。 而且即使他们闲着,我添加了一个周期性的AJAX请求,所谓的心跳,这将更新会话的访问时间和修改时间。 我甚至增加了一个触摸(会话文件$)每次用户点击某事或心跳被调用时。 我试着重新生成会话ID为好。 没有什么帮助。

而遗憾的是,到目前为止,我无法在本地重现该问题,因为它发生,每隔一段时间,当有更多的要求。 php.ini中的一些参数:

session.use_cookies = 1
session.use_only_cookies = 1
session.cookie_lifetime = 0
session.gc_probability = 1
session.gc_divisor = 1500
session.gc_maxlifetime = 10800

Answer 1:

由于会话和认证已经通过在代码中一个超级控制器处理,它应该很容易,至少排除会遭到破坏。

通常只有在登录页面创建一个会话,所以在这一点上,你可以(也应该)里面添加已知值,如会话ID。

其他的网页(包括你的心跳)恢复现有会话,所以在这一点上,你去找上面的值; 如果它是缺失的,你可以做一些更多的检查:

  • 在会话cookie通过呢? 如果不是,浏览器/ cookie的问题。
  • 没有会话cookie与对应session_id() 如果不是,会议文件,由于垃圾收集丢失。
  • 确实已知值在会话中存在吗? 如果没有,会被截断或有人试图做会议通过的攻击。
  • 确实已知值对应于会话cookie? 如果不是,该会议通过比饼干不同的方式设立; 你可以检查session.use_only_cookies设置。

以上组检查应该指向你在正确的方向。



Answer 2:

我想你使用的是内置的PHP文件会话存储? 已知有竞争条件与它的问题。

我有类似的问题,与失去的会话ID的时候有来自同一个会话ID的并发请求。 由于文件是由第一个请求锁定所有其他的并发连接都无法访问文件,其中一些产生新的会话ID。 这些情况也很罕见,我花了时间来查找问题。 从那时起,我使用memcached的会话存储和这些问题消失了。



Answer 3:

我来回答这个没有更多的信息这是很难但是你确定当你有更多的流量这只是发生。 有什么可以做:

  • 添加codez
  • 操作系统发行版和版本
  • PHP版本

你有依赖于IP任何会话检查。 如果是的话它可能是你实际上是使用代理赋予不同的IP每一次这样oftern(如CloudFlare的),在这种情况下,你可以使用HTTP_CF_CONNECTING_IP得到真正不变的IP。

我也注意到一两件事:

session.use_only_cookies = 1
session.cookie_lifetime = 0

因此,当浏览器关闭cookie将实际上被破坏。 是否有可能失去连接,因为用户关闭选项卡(在某些浏览器不实际清除饼干)?

正如其他人建议我会strongely说你移动到一个DB会话。 使用中央会话存储可以在停止比赛条件帮助,它不会完全阻止他们,但它确实使它更难。 此外,如果你真的得到很多的会话ID,你可能要考虑使用比内置于PHP会话ID以外的东西,但是内置的哈希值是非常独特的,具有非常低的是重复的,所以我不认为这是偶然的问题。

澄清编辑:

如果你使用的是其他代理的CloudFlare那么你会,当然,需要获得HTTP头thart您的代理设置,使用CloudFlare的就是一个例子。



Answer 4:

这里的东西我用。 它使用JavaScript来“平”在服务器上的间隔10分钟。

<form method="POST" target="keepalive-target" id="keepalive-form">
    <input type="hidden" name="keepalive-count" id="keepalive-count">
</form>
<iframe style="display:none; width:0px; height:0px;" name="keepalive-target"></iframe>
<script>
    var kaCount=0;
    setInterval(function()
    {
        document.getElementById("keepalive-count").value=kaCount++
        document.getElementById("keepalive-form").submit();
    },600000);
</script>


Answer 5:

所有提供的答案已显示出良好的洞察力的问题,但我只是分享解决我确切的问题。 我终于能够重现问题并解决它。

因此,该系统包含两个子系统,让我们说管理和客户端接口。 管理员意外退出,当他们登录在另一个选项卡客户和退出客户端界面同时登录的管理员。 有人这样做,因为一切都被写入一个会话使用命名空间。 我所做的是删除保存在销毁行动注销会议,并与会话命名空间和解封与客人会替换该命名空间,只有访问登陆页面替换它的代码。



文章来源: How to keep extending session life when user is active?