Dieser Artikel stellt Ihnen hauptsächlich eine Implementierungsmethode zum Erstellen von Instant Messaging vor, die in unserer täglichen Entwicklung häufig vorkommt. Freunde, die es benötigen, können darauf zurückgreifen , lass uns mit dem Editor unten lernen.
Instant Interactive Applications
Jeder sollte erfahren haben, dass Instant Messaging in vielen Szenarien in modernen Webanwendungen benötigt wird, zum Beispiel am häufigsten Der Zahlungsrückruf steht im Zusammenhang mit der Anmeldung Dritter. Diese Geschäftsszenarien müssen grundsätzlich dem folgenden Prozess folgen:
Der Client löst zugehörige Geschäfte aus und generiert Drittanbieter-Anwendungsvorgänge (z. B. Zahlungen)
Der Client wartet auf das Antwortergebnis des Servers (der Benutzer schließt den Vorgang der Drittanbieteranwendung ab)
Die Drittanbieteranwendung benachrichtigt den Server über das Verarbeitungsergebnis (Zahlung erfolgt). abgeschlossen)
Der Server benachrichtigt den Client über die Verarbeitungsergebnisse
Der Client gibt Feedback basierend auf den Ergebnissen (springt zur Zahlungserfolgsseite )
Um diese Art der sofortigen Kommunikation zu erreichen und dem Kunden zu ermöglichen, richtig auf die Verarbeitungsergebnisse zu reagieren, war die Abfrage die am häufigsten verwendete Technologie Aufgrund der einseitigen Natur des HTTP-Protokolls konnte der Client den Server nur immer wieder aktiv nach den Verarbeitungsergebnissen fragen. Diese Methode weist offensichtliche Mängel auf und belegt nicht nur serverseitige Ressourcen, sondern kann auch keine serverseitigen Verarbeitungsergebnisse in Echtzeit erzielen.
Jetzt können wir das WebSocket-Protokoll verwenden, um Echtzeitinteraktionen abzuwickeln. Es ist ein Zwei-Wege-Protokoll, das es dem Server ermöglicht, aktiv Informationen an den Client zu übertragen. In diesem Artikel werden wir das leistungsstarke Ereignissystem von Laravel verwenden, um Echtzeitinteraktionen aufzubauen. Sie benötigen folgende Kenntnisse:
Laravel Event
Redis
Socket.io
Node.js
Redis
Bevor wir beginnen, wir Sie müssen einen Redis-Dienst öffnen und ihn in der Laravel-Anwendung konfigurieren und aktivieren, da wir während des gesamten Prozesses den Abonnement- und Veröffentlichungsmechanismus von Redis verwenden müssen, um Instant Messaging zu erreichen.
Redis ist ein Open-Source- und effizientes Schlüsselwertspeichersystem. Es wird normalerweise als Datenstrukturserver zum Speichern von Schlüssel-Wert-Paaren verwendet und kann Zeichenfolgen, Hashes, Listen, Mengen und geordnete Kombinationen unterstützen. Um Redis in Laravel verwenden zu können, müssen Sie die Paketdatei predis/predis über Composer installieren.
Konfiguration
Die Konfigurationsdatei von Redis in der Anwendung ist in config/database.php gespeichert. In dieser Datei sehen Sie a Das Redis-Array mit den Informationen zum Redis-Dienst:
'redis' => [ 'cluster' => false, 'default' => [ 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, ], ]
Wenn Sie den Port des Redis-Dienstes ändern, achten Sie darauf, dass der Port in der Konfigurationsdatei konsistent bleibt.
Laravel Event
Hier müssen wir die leistungsstarken Event-Übertragungsfunktionen von Laravel nutzen:
Broadcast Event
Viele moderne Anwendungen nutzen Web Sockets, um interaktive Echtzeit-Benutzeroberflächen zu implementieren. Wenn sich einige Daten auf dem Server ändern, wird eine Nachricht an den Client zur Verarbeitung über die WebSocket-Verbindung übermittelt.
Um Ihnen bei der Erstellung dieser Art von Anwendung zu helfen. Laravel erleichtert die Übertragung von Ereignissen über eine WebSocket-Verbindung. Mit Laravel können Sie Ereignisse übertragen, um den Ereignisnamen an Ihre serverseitigen und clientseitigen JavaScript-Frameworks weiterzugeben.
Konfiguration
Alle Event-Broadcast-Konfigurationsoptionen werden in der Konfigurationsdatei config/broadcasting.php gespeichert. Laravel wird mit mehreren verfügbaren Treibern wie Pusher, Redis und Log geliefert. Wir werden Redis als Broadcast-Treiber verwenden, der die Klassenbibliothek predis/predis erfordert.
Da der Standard-Broadcast-Treiber Pusher verwendet, müssen wir BROADCAST_DRIVER=redis
in der .env-Datei festlegen.
Wir erstellen eine WechatLoginedEvent-Ereignisklasse, die gesendet wird, nachdem der Benutzer WeChat gescannt hat, um sich anzumelden:
<?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'; } }
Sie müssen beachten, dass die Methode „broadcastOn“ dies tun sollte Gibt ein Array zurück, das den zu übertragenden Kanal darstellt, und BroadcastAs gibt eine Zeichenfolge zurück, die das durch die Übertragung ausgelöste Ereignis darstellt. Standardmäßig gibt Laravel den vollständigen Klassennamen der Ereignisklasse zurück.
Wichtig ist, dass Sie diese Klasse manuell dazu bringen müssen, den ShouldBroadcast-Vertrag zu implementieren. Laravel hat diesen Namespace beim Generieren von Ereignissen automatisch hinzugefügt, und dieser Vertrag schränkt nur die BroadcastOn-Methode ein.
Nachdem das Ereignis abgeschlossen ist, besteht der nächste Schritt darin, das Ereignis auszulösen. Eine einfache Codezeile reicht aus:
event(new WechatLoginedEvent($token, $channel));
Dieser Vorgang wird ausgeführt löst automatisch die Ausführung des Ereignisses aus und sendet die Nachricht. Der zugrunde liegende Broadcast-Vorgang basiert auf dem Abonnement- und Veröffentlichungsmechanismus von Redis.
RedisBroadcaster veröffentlicht die öffentlich zugänglichen Daten der Veranstaltung über den angegebenen Kanal. Wenn Sie mehr Kontrolle über die offengelegten Daten haben möchten, können Sie dem Ereignis die Methode „broadcastWith“ hinzufügen, die ein Array zurückgeben sollte:
/** * Get the data to broadcast. * * @return array */ public function broadcastWith() { return ['user' => $this->user->id]; }
Node.js und 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 隧道,并对事件进行订阅,根据指定事件的推送进行响应。
总结
Das obige ist der detaillierte Inhalt vonEinführung in die Methode von Laravel zum Erstellen von Sofortanwendungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!