php中同一个账号同时只能一个人登录程序

以前考虑过这个问题,今天实现了一下,挺快的,从研究到开发完成差不多4个小时。有点类似QQ,二台电脑登录,一台会把另一台挤掉线,并提示其他地点登录信息。

一,实现原理

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
redis telnet查看session

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

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

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

时间: 2024-09-30 07:57:53

php中同一个账号同时只能一个人登录程序的相关文章

session-.net单点登录(同一个账号第二次登陆时会把第一次的登陆注销掉)

问题描述 .net单点登录(同一个账号第二次登陆时会把第一次的登陆注销掉) 在网站找了好多帖子,基本都是在登录验证成功后设置Appliction,判断如果是第一个登录将用户名和SessionID存到hash表中,重复时将之前的键值对删除或修改.但问题是第二个人登录时怎么将第一个人的登录状态取消(即将Session清掉)同时通知第一个人有人登录被迫下线. 解决方案 要看 你的应用具体是怎么操作的.举个例子,一个Socket连接的CS系统,在同一个用户第二次登陆后,你去找到第一次登陆的那个,把他的s

如何保障保存在浏览器中的账号和密码安全

不知道有人想过没有,其实你这些保存的账号和密码并不安全,很多时候都可以被别人轻易盗取,甚至不需要什么复杂的技巧和工具,仅用浏览器本身.也许有人觉得这有些耸人听闻了,但是下面的操作技巧会告诉你这是事实. 本篇文章仅以Chrome和Firefox为实例,告诉大家为什么不安全,其他浏览器就不在这里介绍具体方法了(其实网上也能找到) Firefox篇 Firefox菜单[工具]-[选项],选择[安全]选项卡,单击[已保存密码]按纽. 打开[已保存密码]对话框以后,再单击[显示密码]按纽,就会出现下图所示

android-如何获取Android中所有账号的密码?

问题描述 如何获取Android中所有账号的密码? 我想要获取我的android系统中所有账号的密码,编了下面的代码,没实现: AccountManager am = AccountManager.get(this); Account [] acc = am.getAccounts(); if (acc.length > 0){ for (int i=0; i<acc.length; i++){ String password = am.getPassword(acc[i]); listedA

html-在webview中Html Anchor Link只能执行一次

问题描述 在webview中Html Anchor Link只能执行一次 我用anchor link加载html内容时,在webview中遇到一些奇怪的问题.以下代码对于 anchor标签可以很好的执行,但是只能执行一次.当我再次点击 anchor标签时,就不能执行. protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my

java中同一个方法可以被几个类或者被几个对象共享

问题描述 java中同一个方法可以被几个类或者被几个对象共享 java中同一个方法可以被几个类或者被几个对象共享java中同一个方法可以被几个类或者被几个对象共享 解决方案 方法本质上是字节码序列,底层是指令集合.方法是通过对象调用的,对象是存储在堆中的,是所有线程共享的.方法是类型信息,不存在共享这个说法. 解决方案二: java 中的方法都是在类中的,而对于你说的方法可以被几个类或者几个对象共享,这个问题问的没有多大意义,方法属于类的方法,不会被共享,可以被子类复写和调用. 解决方案三: j

无法在android中写入文件,只能读取文件系统

问题描述 无法在android中写入文件,只能读取文件系统 我想在 android 中写入一个文件. private void writeScoreToFile(BlastScore result) { try{ FileWriter fstream = new FileWriter(CaptureActivity.BLAST_SCORES,true); BufferedWriter out = new BufferedWriter(fstream); out.write(Integer.toS

为什么数据库中同一个关系表中的属性名是不能重名的,不同的关系表中的属性名是可以重?能举个例子吗?

问题描述 为什么数据库中同一个关系表中的属性名是不能重名的,不同的关系表中的属性名是可以重?能举个例子吗? 为什么数据库中同一个关系表中的属性名是不能重名的,不同的关系表中的属性名是可以重?能举个例子吗? 解决方案 比如 三张表:学生(学号,姓名),课程(课程名,课程编号),选课(学号,课程号,成绩) 学生表中不能有都叫学号的属性名,比如学生(学号,学号)就是有问题的,表里无法区分这两个学号,也就是同一个关系表中的属性名是不能重名的 学生表和选课表就都能有学号属性,也就是不同的关系表中的属性名是

开发的报表“资产负债表”,直接导出为EXCEL,导出后为空表,同一个账号用别人的电脑导出就是正确的

问题描述 开发的报表"资产负债表",直接导出为EXCEL,导出后为空表,同一个账号用别人的电脑导出就是正确的 开发的报表"资产负债表",直接导出为EXCEL,导出后为空表,同一个账号用别人的电脑导出就是正确的

c#-怎么样在一个student累中设置限制性别只能是男或者女?

问题描述 怎么样在一个student累中设置限制性别只能是男或者女? 怎么样在一个student累中设置限制性别只能是男或者女? 解决方案 字错了,是student类 解决方案二: 将变量sex设为私有的:通过getter,setter来限制: 解决方案三: 用 boolean sex true 代表男,false代表女 解决方案四: C#里面通过属性保护变量 在对属性get取得的值进行判断 如果Genderget到非法字符直接弹提示框并return 设置一个默认值 解决方案五: 一楼正解,就像