用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_time 2個字段

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看該文件有沒有,如有則直接刪除。

三,假如有兩個人以上同時使用的話,那麼前一個的會話文件就會被後面的一個所刪除,也就被逼下線了。

這樣也就達到了每次只能一個帳號使用的目的了,雖然用戶體驗略差,但也算是較高效的方法了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章