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/sessionphp_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值;
最後:
這種實現方式為主動型:登入用戶端主動去監測自己是否被擠掉,而第一種實現方式是被動型:等待下一個用戶端擠掉自己;