Heim > Backend-Entwicklung > PHP-Tutorial > Ein Konto kann nur gleichzeitig auf demselben Gerät angemeldet sein

Ein Konto kann nur gleichzeitig auf demselben Gerät angemeldet sein

WBOY
Freigeben: 2016-09-19 09:16:36
Original
4984 Leute haben es durchsucht

Ich verwende PHP, um zu erkennen, dass ein Konto nur zur gleichen Zeit auf demselben Gerät angemeldet sein kann. Beachten Sie, dass es sich nicht um dieselbe IP handelt.
Zuvor habe ich der MYSQL-Tabelle ein Feld hinzugefügt, um anzuzeigen, ob Sie angemeldet sind. Wenn Sie angemeldet sind, wird es auf 1 gesetzt, und wenn Sie abgemeldet sind, wird es auf 0 gesetzt.
Aber Später stellte ich fest, dass es keine Möglichkeit gibt, dies zu ändern, wenn der Browser zwangsweise geschlossen wird. Das Feld ist auf 0 gesetzt!
Ich habe lange darüber nachgedacht, konnte aber keine Lösung finden. Später habe ich im Internet gesehen, dass es anscheinend mit Redis implementiert werden könnte, also habe ich in den letzten zwei Tagen angefangen, Redis zu lernen. Aber ich habe festgestellt, dass ich keine Ahnung habe, ob ich so weiterlernen werde.
Also bin ich hierher gekommen, um um Rat zu fragen. Kann mir jemand mit Erfahrung sagen, wie ich das umsetzen soll? Danke! Frohes Mittherbstfest an alle!

Antwortinhalt:

Ich verwende PHP, um zu erkennen, dass ein Konto nur zur gleichen Zeit auf demselben Gerät angemeldet sein kann. Beachten Sie, dass es sich nicht um dieselbe IP handelt.
Zuvor habe ich der MYSQL-Tabelle ein Feld hinzugefügt, um anzuzeigen, ob Sie angemeldet sind. Wenn Sie angemeldet sind, wird es auf 1 gesetzt, und wenn Sie abgemeldet sind, wird es auf 0 gesetzt.
Aber Später stellte ich fest, dass es keine Möglichkeit gibt, dies zu ändern, wenn der Browser zwangsweise geschlossen wird. Das Feld ist auf 0 gesetzt!
Ich habe lange darüber nachgedacht, konnte aber keine Lösung finden. Später habe ich im Internet gesehen, dass es scheinbar mit Redis implementiert werden kann, also habe ich in den letzten zwei Tagen angefangen, Redis zu lernen. Aber ich habe festgestellt, dass ich keine Ahnung habe, ob ich so weiterlernen werde.
Also bin ich hierher gekommen, um um Rat zu fragen. Kann mir jemand mit Erfahrung sagen, wie ich das umsetzen soll? Danke! Frohes Mittherbstfest an alle!

Wenn es sich um Redis handelt, können Sie eine Hash-Struktur verwenden, um Kontoanmeldeinformationen zu speichern.

Hash-Struktur: Schlüsselfeldwert

Hash-bezogene Befehle http://redisdoc.com/hash/inde...

Detaillierte Umsetzung:

Wenn in der Hash-Struktur dasselbe Schlüsselfeld zum Schreiben von Daten verwendet wird, werden historische Daten überschrieben

<code class="bash">
Redis> hset key field Test
Redis> hget key field
"Test"
Redis> hset key field Run
Redis> hget key field
"Run"
</code>
Nach dem Login kopieren

Auf diese Weise können die Anforderungen eines einzelnen Kontos erfüllt werden. Geben Sie einen Schlüssel zum Speichern der Kontoanmeldeinformationen an. Das Feld ist der Primärschlüssel jedes Kontos und löscht dann die vorherigen Anmeldeinformationen Die Anmeldeinformationen werden ungültig. Dadurch wird der vorherige Anmeldestatus ungültig.

Wenn Sie die Anmeldung verschiedener Geräte berücksichtigen, können Sie das Feld in die Form „Gerätename-UID“ ändern, um sicherzustellen, dass für ein Gerät nur eine Anmeldeinformation vorhanden sein kann.

Sie müssen wissen, was Sie brauchen?
Einmalige Anmeldung oder Beschränkung auf ein einzelnes Gerät
Ein einzelnes Gerät ist derselbe Computer mit mehreren Browsern?

Eine Lösung zur Verwendung von MySQL

Wenn die Effizienz nicht berücksichtigt wird, müssen Sie nur Ablaufzeit und eindeutige Gerätekennung hinzufügen. Zwei Felder ändern die vorherige Bedingung für die Beurteilung, ob eine Anmeldung erforderlich ist, von „ob es 1 ist.“ " zu „ob es 1 ist und nicht abgelaufen ist und die eindeutige Gerätekennung konsistent ist.“ Jedes Mal, wenn der Benutzer einen Vorgang ausführt, wird der Wert von Ablaufzeit aktualisiert. Wenn für einen bestimmten Zeitraum kein Vorgang ausgeführt wird, kann der Anmeldestatus „automatisch“ ablaufen. Dies kann Ihr Problem „zwingend“ lösen Schließen des Browsers. Setzen Sie dieses Feld auf 0.

Verwenden Sie phpredis für eine einfache Implementierung

Wenn Sie neu bei

sind und nur

verwenden müssen, um die Benutzeranmeldung zu steuern, aber nicht viel über die Datenstruktur wissen, kann der Typ redis Sie zufriedenstellen (verwenden Sie nach Möglichkeit redisvielleicht wird es besser). string hashDas Folgende wird anhand der verwandten Klassen beschrieben, die von der phpredis-Erweiterung als Hintergrund bereitgestellt werden:

Gehen Sie davon aus, dass sich ein Konto mit

=100 anmeldet, und zeichnen Sie die Anmeldegeräteinformationen in Redis auf

用户id

Jedes Mal, wenn das Gerät andere Vorgänge ausführt, muss es die Ablaufzeit der Geräteinformationen in Redis aktualisieren
<code class="php"><?php
/**
 * 注册用户登录设备信息
 * 
 * 登录后向redis中写入登录的设备标识信息,如果在此之前已经登录了别的设备,之前登录的设备将被强制下线
 */
function registerUserDevice()
{
    $userId = 100; // 假设用户id为100
    $redis = new Redis();
    $redisHost = '127.0.0.1';
    $redisPort = 6379;
    $redis->connect($redisHost, $redisPort);
    $cacheName = 'deviceUUID:user'.$userId; 
    $deviceUUID = getDeviceUUID(); // 假设有 getDeviceUUID() 函数用于获取/生成设备的唯一标识符
    $timeout = 600; // 用户10十分钟无操作自动下线
    $redis->set($cacheName, $deviceUUID);
    $redis->setTimeout($cacheName, $timeout);
}</code>
Nach dem Login kopieren

Wenn sich das Benutzerkonto auf dem Gerät abmeldet, müssen die Geräteinformationen in Redis gelöscht werden
<code class="php"><?php
/**
 * 延长redis中设备标识信息的生存时间
 *
 * 重新设置redis中用户设备标识信息的过期时间
 * @return bool true = 更新成功, false = 更新失败,当前设备需要重新登录
 */
function extendDeviceInfoTTL()
{
    $userId = 100; // 假设用户id为100
    $redis = new Redis();
    $redisHost = '127.0.0.1';
    $redisPort = 6379;
    $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;
}</code>
Nach dem Login kopieren

Natürlich ist die obige Lösung, den String-Typ anstelle des Hash-Typs zu verwenden, im Hinblick auf die Ressourcennutzung und Effizienz nicht sinnvoll. Wenn Sie ein tieferes Verständnis und eine tiefere Anwendung von Redis erlangen möchten, empfehle ich Ihnen die Lektüre des Buches „Redis IN ACTION“. Speziell für die Verwendung von Redis in PHP können Sie wählen, ob Sie die Erweiterung phpredis oder predis verwenden möchten.
<code class="php"><?php
/**
 * 销毁用户设备信息
 * 
 * 用在执行登出操作时
 */
function delUserDevice()
{
    $userId = 100; // 假设用户id为100
    $redis = new Redis();
    $redisHost = '127.0.0.1';
    $redisPort = 6379;
    $redis->connect($redisHost, $redisPort);
    $cacheName = 'deviceUUID:user'.$userId; 
    $redis->delete($cacheName);
}</code>
Nach dem Login kopieren

Ein Projekt, an dem ich vor einiger Zeit gearbeitet habe, hatte wahrscheinlich so etwas wie dieses. Der allgemeine Zweck bestand darin, dass sich nur ein Terminal bei diesem Konto anmelden konnte, das heißt, ein Konto konnte nicht an mehreren Orten gleichzeitig angemeldet werden.

Die Lösung besteht darin, der Datenbank jedes Mal ein neues Token hinzuzufügen, das auf dem Zeitstempel und anderen basiert. Wenn es sich ändert, bedeutet dies, dass das Benutzer hat sich woanders angemeldet.

Fügen Sie ein Feld zur Datenbank hinzu: Nach der Anmeldung wird dieses temporäre Token zufällig generiert. Wenn sich ein anderes Gerät anmeldet, wird das temporäre Token aktualisiert. Das Original Die Sitzung des Geräts kann nicht mit dem Datenbank-Token übereinstimmen. Es springt automatisch heraus!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage