php 控制同一个用户只能同时一个人在线

我弄了一个系统,PHP写的,现在想控制一个用户只能同时一个人在线,如果用相同的用户密码登录了的话,就提示已经登录,百度上的一些思路都是说在 登录的时候在数据库中写入一个标志符1,如果在登录就验证标志符,我觉得这个不全面,问题就是如果我关闭浏览器了,标识符怎么置0,用session到期?那怎么触发mysql update事件?正常退出当然可以弄,但是如果是电源关闭,或者用户直接关闭浏览器的话,怎么触发这个事件呢? 哪位大神指教一下小弟呢,非常感谢
我现在的思路就是,用户登录了之后,在登录表中置1;并记录session id,现在就是不知如果session过期了之后,怎么把登录表置0

第1个回答  2016-06-24
这其实是一个策略问题,看你想保留首次的登录状态还是末次的登录状态。
一般的实现都是保留末次的登录态,每次登录之后拿到最新的sessionid置成有效,以往的全部置成无效。这样可以避免很多麻烦和逻辑上的问题。
类似于QQ的:您的账号在其它地方登录,您被迫下线。追问

大神,有没有参考的代码!

追答

代码真的没有
可以放弃使用php自带的session系统。登录成功之后自己随机md5一个字符串表示sessionid,种到cookie里。同时把sessionid和userid关联后写到数据库或其它的什么地方,再次登录会得到新的sessionid,重新写库,把原来的sessionid全部删除或置成无效并标示出原因(被挤掉)。

前端取用户信息的时候根据sessionid可以从库里查到userid进而取到用户信息,旧的sessionid已经被删除自然被踢出登录态,产品线有很大的空间进行相关提示。

追问

恩恩 那如果不是通常的注销session 而是强制的关掉浏览器 或者 关机 我知道关掉浏览器会注销session的 那如果要去执行一些sql,把数据库标识符设为false,该如何处理呢?

追答

session表
sessionid freshtime userid ... freshtime表示最后一次刷新的时间,首次登录就是登录时间
用户每次刷新页面或发起新的请求都在sessionid的时间实时刷新freshtime,然后设定一个产品策略:X分钟之内的sesssionid是有效的,比如30分钟。30分钟之后用户再请求用户信息可以发现freshtime已经30分钟之前就表示过期了需要引导重新登录。中途关闭浏览器,系统最多保留30分钟的有效期,30分钟期间再次访问还是登录态,freshtime又再次刷新了,就是说统计当有在线人数的话会有一些小偏差。

大访问量的系统进行高频次的update会对数据库造成不小的压力,可以把sessionid迁移到redis或memcache之中,设定过期时间,大同小异的实现方式。

本回答被提问者采纳
相似回答