Maison >développement back-end >tutoriel php >Introduction à la méthode Laravel de création d'applications instantanées
Cet article vous présente principalement une méthode d'implémentation de création d'applications instantanées dans Laravel. La messagerie instantanée est souvent rencontrée dans notre développement quotidien. Cet article la présente en détail à travers un exemple de code. Les amis qui en ont besoin peuvent s'y référer. , apprenons avec l'éditeur ci-dessous.
Applications interactives instantanées
Tout le monde devrait avoir compris que la messagerie instantanée est nécessaire dans de nombreux scénarios dans les applications Web modernes, par exemple les plus courantes. le rappel de paiement est lié à la connexion d’un tiers. Ces scénarios métiers doivent essentiellement suivre le processus suivant :
Le client déclenche des activités liées et génère des opérations d'application tierces (telles que le paiement)
Le client attend le résultat de la réponse du serveur (l'utilisateur termine l'opération de l'application tierce)
L'application tierce informe le serveur du résultat du traitement (le paiement est terminé)
Le serveur informe le client des résultats du traitement
Le client donne un retour en fonction des résultats (passe à la page de réussite du paiement )
Dans le passé, afin d'obtenir ce type de communication instantanée et de permettre au client de répondre correctement aux résultats du traitement, la technologie la plus couramment utilisée était le sondage. Étant donné la nature unidirectionnelle du protocole HTTP, le client ne pouvait que demander activement au serveur les résultats du traitement, encore et encore. Cette méthode présente des défauts évidents. Non seulement elle occupe des ressources côté serveur, mais elle ne peut pas non plus obtenir les résultats du traitement côté serveur en temps réel.
Désormais, nous pouvons utiliser le protocole WebSocket pour gérer les interactions en temps réel. Il s'agit d'un protocole bidirectionnel qui permet au serveur de transmettre activement des informations au client. Dans cet article, nous utiliserons le puissant système d'événements de Laravel pour créer des interactions en temps réel. Vous aurez besoin des connaissances suivantes :
Laravel Event
Redis
Socket.io
Node.js
Redis
Avant de commencer, nous Nous devons ouvrir un service Redis, le configurer et l'activer dans l'application Laravel, car tout au long du processus, nous devons utiliser le mécanisme d'abonnement et de publication de Redis pour obtenir une messagerie instantanée.
Redis est un système de stockage clé-valeur open source et efficace. Il est généralement utilisé comme serveur de structure de données pour stocker des paires clé-valeur et peut prendre en charge des chaînes, des hachages, des listes, des ensembles et des combinaisons ordonnées. Pour utiliser Redis dans Laravel, vous devez installer les fichiers du package predis/predis via Composer.
Configuration
Le fichier de configuration de Redis dans l'application est stocké dans config/database.php Dans ce fichier, vous pouvez voir un. Le tableau redis contenant les informations du service Redis :
'redis' => [ 'cluster' => false, 'default' => [ 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, ], ]
Si vous modifiez le port du service redis, veuillez garder le port cohérent dans le fichier de configuration.
Événement Laravel
Ici, nous devons utiliser les puissantes capacités de diffusion d'événements de Laravel :
Diffusion d'événement
De nombreuses applications modernes utilisent Web Sockets pour implémenter des interfaces utilisateur interactives en temps réel. Lorsque certaines données changent sur le serveur, un message est transmis au client pour traitement via la connexion WebSocket.
Pour vous aider à construire ce type d'application. Laravel facilite la diffusion d'événements via une connexion WebSocket. Laravel vous permet de diffuser des événements pour partager le nom de l'événement sur vos frameworks JavaScript côté serveur et côté client.
Configuration
Toutes les options de configuration de diffusion d'événements sont stockées dans le fichier de configuration config/broadcasting.php. Laravel est livré avec plusieurs pilotes disponibles tels que Pusher, Redis et Log. Nous utiliserons Redis comme pilote de diffusion, qui nécessite la bibliothèque de classes predis/predis.
Étant donné que le pilote de diffusion par défaut utilise le pusher, nous devons définir BROADCAST_DRIVER=redis
dans le fichier .env.
Nous créons une classe d'événements WechatLoginedEvent à diffuser après que l'utilisateur ait scanné WeChat pour se connecter :
<?php namespace App\Events; use App\Events\Event; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class WechatLoginedEvent extends Event implements ShouldBroadcast { use SerializesModels; public $token; protected $channel; /** * Create a new event instance. * * @param string $token * @param string $channel * @return void */ public function __construct($token, $channel) { $this->token = $token; $this->channel = $channel; } /** * Get the channels the event should be broadcast on. * * @return array */ public function broadcastOn() { return [$this->channel]; } /** * Get the name the event should be broadcast on. * * @return string */ public function broadcastAs() { return 'wechat.login'; } }
Vous devez noter que la méthode BroadcastOn doit renvoie un tableau, qui représente la chaîne à diffuser, et BroadcastAs renvoie une chaîne, qui représente l'événement déclenché par la diffusion. Laravel renvoie par défaut le nom complet de la classe d'événement. Voici AppEventsWechatLoginedEvent.
. La chose importante est que vous devez manuellement faire en sorte que cette classe implémente le contrat ShouldBroadcast. Laravel a automatiquement ajouté cet espace de noms lors de la génération d'événements, et ce contrat ne contraint que la méthode BroadcastOn.
Une fois l'événement terminé, l'étape suivante consiste à déclencher l'événement. Une simple ligne de code suffit :
event(new WechatLoginedEvent($token, $channel));
Cette opération va. déclencher automatiquement l'exécution de l'événement et diffuser le message. La couche inférieure de cette opération de diffusion repose sur le mécanisme d'abonnement et de publication de Redis.
RedisBroadcaster publiera les données accessibles au public lors de l'événement via le canal indiqué. Si vous souhaitez avoir plus de contrôle sur les données exposées, vous pouvez ajouter la méthode BroadcastWith à l'événement, qui devrait renvoyer un tableau :
/** * Get the data to broadcast. * * @return array */ public function broadcastWith() { return ['user' => $this->user->id]; }
Node.js et Socket.io
对于发布出去的信息,我们需要一个服务来对接,让其能对 redis 的发布能够进行订阅,并且能把信息以 WebSocket 协议转发出去,这里我们可以借用 Node.js 和 socket.io 来非常方便的构建这个服务:
// server.js var app = require('http').createServer(handler); var io = require('socket.io')(app); var Redis = require('ioredis'); var redis = new Redis(); app.listen(6001, function () { console.log('Server is running!') ; }); function handler(req, res) { res.writeHead(200); res.end(''); } io.on('connection', function (socket) { socket.on('message', function (message) { console.log(message) }) socket.on('disconnect', function () { console.log('user disconnect') }) }); redis.psubscribe('*', function (err, count) { }); redis.on('pmessage', function (subscrbed, channel, message) { message = JSON.parse(message); io.emit(channel + ':' + message.event, message.data); });
这里我们使用 Node.js 引入 socket.io 服务端并监听 6001 端口,借用 redis 的 psubscribe 指令使用通配符来快速的批量订阅,接着在消息触发时将消息通过 WebSocket 转发出去。
Socket.io 客户端
在 web 前端,我们需要引入 Socket.io 客户端开启与服务端 6001 端口的通讯,并订阅频道事件:
// client.js let io = require('socket.io-client') var socket = io(':6001') socket.on($channel + ':wechat.login', (data) => { socket.close() // save user token and redirect to dashboard })
至此整个通讯闭环结束,开发流程看起来就是这样的:
在 Laravel 中构建一个支持广播通知的事件
设置需要进行广播的频道及事件名称
将广播设置为使用 redis 驱动
提供一个持续的服务用于订阅 redis 的发布,及将发布内容通过 WebSocket 协议推送到客户端
客户端打开服务端 WebSocket 隧道,并对事件进行订阅,根据指定事件的推送进行响应。
总结
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!