日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php如何同设备连接不上,一个账号同时只能在同一个设备上登陆

發布時間:2025/4/5 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php如何同设备连接不上,一个账号同时只能在同一个设备上登陆 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我用PHP實現一個賬號只能同時在同一個設備登錄,注意,不是同一個IP。

之前是在MYSQL的表中加了個顯示是否登錄了的字段,若登錄了設置為1,退出設置為0.

但后來發現,強行關閉瀏覽器的時候就沒辦法把這個字段設置為0了!

想了很久沒想出解決方案,后來在網上看到好像可以用redis來實現,于是這兩天開始學redis。但發現這樣學下去也沒有什么思路啊。

所以上來請教一下,請問有誰有經驗的可以說一下怎么實現嗎?謝謝!祝大家中秋節快樂!

回復內容:

我用PHP實現一個賬號只能同時在同一個設備登錄,注意,不是同一個IP。

之前是在MYSQL的表中加了個顯示是否登錄了的字段,若登錄了設置為1,退出設置為0.

但后來發現,強行關閉瀏覽器的時候就沒辦法把這個字段設置為0了!

想了很久沒想出解決方案,后來在網上看到好像可以用redis來實現,于是這兩天開始學redis。但發現這樣學下去也沒有什么思路啊。

所以上來請教一下,請問有誰有經驗的可以說一下怎么實現嗎?謝謝!祝大家中秋節快樂!

如果是 Redis 的話, 可以使用 hash 結構來存儲賬戶登入信息.

hash 的結構: key field value

hash 相關使用命令 http://redisdoc.com/hash/inde...

具體實現:

hash 結構中, 使用相同的 key field 寫入數據時, 會覆蓋掉歷史數據

Redis> hset key field Test

Redis> hget key field

"Test"

Redis> hset key field Run

Redis> hget key field

"Run"

這樣就能實現單個賬戶的需求, 指定一個 key 用來存儲賬戶登入信息, field 就是每個賬戶的主鍵, 那么每次登錄都會將上一次的登入信息清空, 之前的登入信息就失效了, 這樣就能達到之前的登錄狀態失效.

如果考慮到不同設備的登錄, 可以將 field 變為 devicename-uid 這種形式, 保證一個設備只能夠有一個登錄信息存在.

你要知道你需要什么?

單點登錄還是限制單設備

單設備是同一臺電腦多個瀏覽器?

關于使用mysql的一種解決方法

如果不考慮效率,只需要在mysql中你原有的記錄是否已登錄的字段旁再增加過期時間和設備唯一標識符兩個字段,將以前的判斷是否登錄的條件由“是否為1”變為“是否為1且未過期且設備唯一標識符一致”。每次用戶有操作時都更新過期時間的值,如果一段時間沒有操作,登錄狀態就可以“自動”過期,這樣就可以解決你的“強行關閉瀏覽器的時候就沒辦法把這個字段設置為0了”的問題。

使用phpredis進行簡單實現

如果你剛接觸redis,且僅僅需要用redis做用戶登錄的控制,對于數據結構,你不是很了解,string類型即可滿足你(如果可以,使用hash可能會更好)。

下面以phpredis擴展提供的相關類作為背景,進行描述:

假設某一用戶id為100的賬戶登錄,向redis中記錄登錄設備信息

connect($redisHost, $redisPort);

$cacheName = 'deviceUUID:user'.$userId;

$deviceUUID = getDeviceUUID(); // 假設有 getDeviceUUID() 函數用于獲取/生成設備的唯一標識符

$timeout = 600; // 用戶10十分鐘無操作自動下線

$redis->set($cacheName, $deviceUUID);

$redis->setTimeout($cacheName, $timeout);

}

設備每次執行其它操作前,都需要更新redis中設備信息的過期時間

connect($redisHost, $redisPort);

$cacheName = 'deviceUUID:user'.$userId;

$deviceUUID = getDeviceUUID(); // 假設有 getDeviceUUID() 函數用于獲取/生成設備的唯一標識符

$timeout = 600; // 用戶10十分鐘無操作自動下線

$cachedDeviceUUID = $redis->get($cacheName);

$isTimeout = false === $cachedDeviceUUID;

$isTheRightDevice = $deviceUUID === $cachedDeviceUUID;

if($isTimeout || !$isTheRightDevice){

return false;

}

$redis->setTimeout($cacheName, $timeout);

return true;

}

設備中用戶賬戶退出時,需要清理redis中的該設備信息

connect($redisHost, $redisPort);

$cacheName = 'deviceUUID:user'.$userId;

$redis->delete($cacheName);

}

當然了,上面的使用string類型而不是散列類型來實現的解決方案在資源利用和效率上是不太合理的。如果你希望對redis有更深的了解和運用推薦你閱讀《Redis IN ACTION》這本書。具體到php中使用redis,你可以選擇使用phpredis擴展或predis。

前段時間做的一個項目大概也有這么一個東西,大概目的是只能有一個終端在登錄這個賬號,即不能一個賬號多處同時登錄。

解決辦法是在數據庫中添加了一個字段token,每次登錄根據時間戳加其他的生成一個新的token,在整個過程中不斷檢測token,如果發生改變了,那說明有用戶在別處登錄。

數據庫加個字段:臨時的token;等登錄后,這個臨時的token會隨機生成,同時用戶會根據這個token生成對應的sesssion;當另外一個設備登錄后,臨時的token更新了;原有設備的session無法匹配數據庫的token;就會自動跳出!

本文原創發布php中文網,轉載請注明出處,感謝您的尊重!

總結

以上是生活随笔為你收集整理的php如何同设备连接不上,一个账号同时只能在同一个设备上登陆的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。