php只能一个用户登录,php 实现同一个账号同时只能一个人登录

php 实现同一个账号同时只能一个人登录

有点类似QQ,二台电脑登录,一台会把另一台挤掉线,并提示其他地点登录信息。

php 实现同一个账号同时只能一个人登录方法一

一,实现原理

1,用户在电脑A登录,session信息存放在redis当中,并将session_id存到mysql数据库中。

2,同一用户在电脑B登录,验证完用户名和密码后,将该用户信息从数据库读出,取得用户在电脑A登录的session_id,然后在到redis中验证session是否过期。

3,如果过期,不用openfire推送提示信息。如果没有过期,php利用openfire推送消息后,在将redis中用户在电脑A中登录的session删除掉,删除后,在将用户在电脑B登录的个人信息放到session中,并将电脑B登录的session_id更新到数据库中,在这里一定要先发送推送,然后在清空session,不然用户在电脑A收不到xmpp发过来的消息。

注意:

openfire是java cms的一种,自身有数据库,您创建的用户表根openfire自带的用户表之间要建立某种联系(如:手机号,邮箱等),方便信息推送。

同一session_id肯定是在相同媒介上登录的,这个时候,也不用更新数据库和推送消息

下面简单说一下安装过程,以及要注意的地方。

二,安装所用到的工具

# yum install php php-fpm nginx mysql mysql-server redis php-redis php-devel php-pdo php-mysql

修改session存储方式:

# vim /etc/php-fpm.d/www.conf

;php_value[session.save_handler] = files //注释掉旧的

;php_value[session.save_path] = /var/lib/php/session

php_value[session.save_handler] = redis //添加以下内容

php_value[session.save_path] = "tcp://127.0.0.1:6379"

启动服务后,如果以下内容说明,session存redis成功了

redis telnet查看session

openfire下载地址:http://www.igniterealtime.org/downloads/

# rpm -ivh ./*.rpm //下载的是rpm安装包

openfire启动后,然后访问http://ip:9090,一步一步配置就成了,有一点要注意就是数据库的编码。

php 实现同一个账号同时只能一个人登录方法二

首先有几点区别:

1、不缓存session到nosql中

2、不保存session_id到mysql中

实现逻辑:

1、比如账号是admin,那么表字段login_count记入登录次数;

2、账号登录后把login_count记入到session中;

3、在框架入口文件或者权限验证处检测session中的login_count与mysql中的login_count是否

相等,相等则是当前用户,不相等则退出并且抛出异常(在此处判断是否为ajax是ajax则发送json否则直接跳转提示页面);

应用场景:

假如A客户端登录后session中的login_count为1,数据库中的login_count也是1;

在B客户端也登录了该账号那么则更新login_count为2,session中login_count也为2,相应的,A客户端在实习逻辑第3点中的验证规未通过则会退出,;

缺点:

实时监测mysql中login_count的变化会浪费mysql资源,可以把该字段缓存在文件中或者nosql中,只要mysql该字段有更新则一同更新缓存中的login_count值;

最后:

这种实现方式为主动型:登录客户端主动去监测自己是否被挤掉,而第一种实现方式是被动型:等待下一个客户端挤掉自己;

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值