用PHP实现同一个帐号不允许同时登陆,只允许一个帐号登录?

  数据库表user_login_info

  字段:id,user_ip,user_id,last_access_time

  user_id做唯一性索引

  1.用户登录后

  如果没有当前用户的数据,插入一条数据,user_ip(用户机器的IP),user_id(用户ID),last_access_time(当前登录时间)

  如果已经存在,则更新user_ip,last_access_time2个字段

  2.如何判断?

  另一个用户,如果用相同的账号

  1)在同一台机器上再次登录的情况【ip相同】,直接更新这个用户的last_access_time时间为最新时间就可以了。

  处理:直接更新last_access_time为最新时间

  2)在另外一台机器上登录的情况【ip不同】,根据user_id取出数据,判断ip和last_access_time(上次登录时间),

  如果当前时间now()-last_access_time<10(分钟)【这里是关键,设置一个时间】,说明有人在其他机器上已经登录了,则不允许登录。

  now()-last_access_time>10(分钟),则可以登录,说明另一个人要不已经有10分钟没有活动了,要不就是没登陆,这2种情况下都允许重新登录。

  3.在程序的入口文件index.php(ZF框架参考),每次用户登录后的操作,都更新last_access_time时间为最新时间(这个也许效率上需要考虑一下,其实也应该没什么问题,数据库完全可以承受,也可以在程序里加上一个判断,last_access_time时间存在session里,如果这个时间跟当前时间date()比较,超过设定的10分钟时间,则更新数据库last_access_time字段。这样可以减少更新数据库的次数)

  4.异常退出的情况,比如用户直接关闭浏览器,数据库里还有这条记录,因为设置的过期时间是10分钟,所以如果同一个用户立刻再次登录的情况下,肯定不行,会提示已经有人登陆了。但10分钟后就可以再次登录,所以这个10分钟时间看具体情况,可以设置成1分钟,或其他时间。

  但这个时间不要设置成几个小时,那用户会疯掉。

  原理:就是设置一个过期时间的技巧和记录IP。

  一,会员表加一个字段(last_session),会员登陆时获取当前SESSIONID更新此字段。

  二,会员登陆时取得该(last_session)值去session_save_path看该文件有没有,如有则直接删除。

  三,假如有两个人以上同时使用的话,那么前一个的会话文件就会被后面的一个所删除,也就被逼下线了。

  这样也就达到了每次只能一个帐号使用的目的了,虽然用户体验略差,但也算是较高效的方法了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值