Maison >développement back-end >Problème PHP >Comment se connecter à un seul utilisateur en php

Comment se connecter à un seul utilisateur en php

藏色散人
藏色散人original
2022-12-19 10:43:185566parcourir

Comment se connecter à un seul utilisateur en PHP : 1. Initialisez le socket dans le front-end uni-app ; 2. Recevez un message de type "sortie forcée" en temps réel 3. Utilisez le back-end PHP pour recevoir le message ; Paramètre « identification unique de l'appareil » ; 4. Envoyez le message en fonction de l'ID client dans le cache.

Comment se connecter à un seul utilisateur en php

L'environnement d'exploitation de ce tutoriel : système Windows 10, PHP version 8.1, ordinateur Dell G3.

Comment connecter un seul utilisateur en php ?

uni-app combine PHP pour obtenir une connexion utilisateur unique

Connexion utilisateur unique, c'est-à-dire que dans une application, le même utilisateur ne peut se connecter qu'une seule fois en ligne , et qu'un utilisateur peut se connecter, il sera immédiatement mis hors ligne sur les autres appareils. Après confirmation, effacez le chargement de la connexion sur l'appareil et revenez à l'interface de connexion.

uni-app est actuellement capable de packager Android, IOS, l'applet WeChat, l'applet Toutiao Alipay et H5 en utilisant le framework vue.js et n'a besoin que d'écrire un ensemble de codes. En utilisant l'outil HBuilder, il est pratique pour le débogage. et le packaging cloud Concernant les certificats Apple, recommandez CW.PUB, https://cw.pub/index/document/index. Utilisez HBuilder pour créer un package de jailbreak et signez-le sur ce site Web pour l'installer sur un téléphone Apple normal. Cependant, il existe d'autres méthodes sur Internet qui ne sont pas répertoriées ici.

Généralement, les applications utiliseront des plates-formes push de messages tierces pour la connexion d'un seul utilisateur, bien qu'uni-app puisse également se connecter à des plates-formes push telles que Umeng et Jiguang. Cependant, en raison de contraintes de temps, l'examen de la plate-forme d'accueil et d'autres processus ne nous laissent pas de temps. J'ai déjà utilisé gatewayworkman et websocket pour effectuer une discussion instantanée, donc la connexion mono-utilisateur est également implémentée à l'aide de websocket.

Exemple de connexion mono-utilisateur au socket uni-app

1. Le front-end uni-app envoie l'identifiant unique de l'appareil actuel lors de l'initialisation du socket, puis reçoit un message de type "force exit" en temps réel. Ceci est juste un exemple simple.

//初始化
socket.on('init', () => { //连接初始化
socket.send({
type: 'login',
token: uni.getStorageSync('access_token'),
device_no: plus.device.uuid,//手机设备唯一编号
});
}).on('quit_push',(res)=> {
if(res) {
uni.showModal({
title: '退出通知',
content: '你的账号在其他设备上登录!',
showCancel: true,
cancelText: '取消',
confirmText: '确定',
success: res => {
if(res.confirm) {
uni.clearStorageSync()
store.commit('chat/clear')
uni.reLaunch({
url:"../../pages/login/index"
})
}else if(res.cancel) {
uni.clearStorageSync()
store.commit('chat/clear')
uni.reLaunch({
url:"../../pages/login/index"
})
}
}
});
}
});

2. Le backend reçoit le paramètre "identification unique de l'appareil" et vérifie d'abord si le cache existe. Il n'y a pas d'ID client enregistrant l'identification et le socket de l'appareil.

3. L'interface de connexion reçoit l'identification de l'appareil et l'enregistrement d'identification est récupéré du cache ou de la bibliothèque pour déterminer s'il est cohérent avec l'identification de l'appareil actuellement reçue. S'il est incohérent, le message est envoyé en fonction de l'identification de l'appareil actuellement reçue. ID client dans le cache.

$is_online = Db::name('UserLoginClient')->where('user_id',$user['id'])->order('id desc')->find();
if(isset($device_no) && $device_no && $is_online['device_no'] != $device_no && !empty($is_online['device_no'])) { 
Tools::sendToClient($is_online['client_id'],json_encode([
'type' => 'quit_push',
'data' => 'ip',
'message' => '强制下线'
]));
}

4. Partie de la méthode sendToClient de la classe d'outils

public static function sendToClient($client_id, $message)
    {
        Gateway::sendToClient($client_id, $message);
    }

Exemple de connexion push pour un seul utilisateur

1 Tout d'abord, nous nous sommes connectés avec Umeng, y compris le front-end et le back-end, en ajoutant le SDK et en utilisant leurs méthodes.

2. Le message push a une valeur unique « jeton », appelée ici « pushtoken », qui est générée par le client et peut identifier un appareil unique.

3. Lorsque le backend se connecte, il reçoit le pushtoken et détermine également si le pushtoken existe. S'il n'existe pas, il sera stocké avec l'ID utilisateur comme clé.

4. Lorsqu'il existe, il sera jugé s'il est cohérent avec le cache. S'il est cohérent, le temps de cache sera allongé. S'il est incohérent, un message sera poussé vers l'ancien pushtoken (en). le cache) et le nouveau pushtoken sera mis en cache.

if (self::$headToken && Cache::has(self::$prefix . self::$userId)) {
            if (self::$headToken == Cache::get(self::$prefix . self::$userId)) {
                Cache::set(self::$prefix . self::$userId, self::$headToken, self::$timeOut);
            } else {        // 换了手机,客户端重新发送pushtoken到服务端,服务端与缓存中的pushtoken比较,不同则给原来pushtoken手机推送一条并重新缓存新的token
                // modify by wensen on 20180816
                // $addr = getCity();
                $addr = getMobCity();
                $ip = request()->ip();
                
                if ($addr) {
                    $addr['province'] = empty($addr['province']) ? '' : $addr['province'];
                    $addr['city'] = empty($addr['city']) ? '' : $addr['city'];
                    // $address = "\t" . $addr['country'] . "-" . $addr['region'] . "-" . $addr['city'] . " (IP:" . $ip . ")\t";
                    $address = "\t" . $addr['country'] . "-" . $addr['province'] . "-" . $addr['city'] . " (IP:" . $ip . ")\t";
                } else {
                    $address = "IP:" . $ip . "";
                }
                $OldToken = Cache::get(self::$prefix . self::$userId);
                if (strlen($OldToken) == 64) {
                    $content = array(
                        'title' => 'APP紧急通知',
                        'body' => '您的账号于:' . date('Y-m-d H:i:s') . '在' . $address . '处登录,若不为您本人登录,请您立即修改密码!',
                        'pull_service' => 'login'
                    );
                    \umeng\Push::send($OldToken, 'unicast', $content, 'message', true);
                } elseif (strlen($OldToken) == 44) {
                    $content = array(
                        'pull_service' => 'login',
                        'msg' => '您的账号于:' . date('Y-m-d H:i:s') . '在' . $address . '处登录,若不为您本人登录,请您立即修改密码!'
                    );
                    \umeng\Push::send($OldToken, 'unicast', $content, 'message', true);
                }
                Cache::set(self::$prefix . self::$userId, self::$headToken, self::$timeOut);
            }
        } else {
            Cache::set(self::$prefix . self::$userId, self::$headToken, self::$timeOut);
        }

5. Le client APP reçoit des notifications push pour les invites contextuelles et le traitement de sortie.

6. Ce qui précède est la méthode push encapsulée selon le SDK d'Umeng, qui inclut la monodiffusion, la diffusion, le saut d'activité d'application, le saut de connexion à une page Web, etc.

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn