1. 程式人生 > >用PHP實現同一個帳號不允許同時登陸,只允許一個帳號登入?

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

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

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