Heim > Backend-Entwicklung > PHP-Tutorial > Einführung in die Implementierungsmethode zum Erstellen von Sofortanwendungen in Laravel

Einführung in die Implementierungsmethode zum Erstellen von Sofortanwendungen in Laravel

巴扎黑
Freigeben: 2023-03-15 17:04:01
Original
1350 Leute haben es durchsucht

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:


1

2

3

4

5

6

7

8

9

'redis' => [

 'cluster' => false,

 

 'default' => [

 'host' => '127.0.0.1',

 'port' => 6379,

 'database' => 0,

 ],

]

Nach dem Login kopieren

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:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<?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 &#39;wechat.login&#39;;

 }

}

Nach dem Login kopieren

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:


1

event(new WechatLoginedEvent($token, $channel));

Nach dem Login kopieren

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:


1

2

3

4

5

6

7

8

9

/**

 * Get the data to broadcast.

 *

 * @return array

 */

 public function broadcastWith()

 {

 return [&#39;user&#39; => $this->user->id];

 }

Nach dem Login kopieren

Node.js und Socket.io

对于发布出去的信息,我们需要一个服务来对接,让其能对 redis 的发布能够进行订阅,并且能把信息以 WebSocket 协议转发出去,这里我们可以借用 Node.js 和 socket.io 来非常方便的构建这个服务:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

// server.js

var app = require(&#39;http&#39;).createServer(handler);

var io = require(&#39;socket.io&#39;)(app);

 

var Redis = require(&#39;ioredis&#39;);

var redis = new Redis();

 

app.listen(6001, function () {

 console.log(&#39;Server is running!&#39;) ;

});

 

function handler(req, res) {

 res.writeHead(200);

 res.end(&#39;&#39;);

}

 

io.on(&#39;connection&#39;, function (socket) {

 socket.on(&#39;message&#39;, function (message) {

 console.log(message)

 })

 socket.on(&#39;disconnect&#39;, function () {

 console.log(&#39;user disconnect&#39;)

 })

});

 

 

redis.psubscribe(&#39;*&#39;, function (err, count) {

});

 

redis.on(&#39;pmessage&#39;, function (subscrbed, channel, message) {

 message = JSON.parse(message);

 io.emit(channel + &#39;:&#39; + message.event, message.data);

});

Nach dem Login kopieren

这里我们使用 Node.js 引入 socket.io 服务端并监听 6001 端口,借用 redis 的 psubscribe 指令使用通配符来快速的批量订阅,接着在消息触发时将消息通过 WebSocket 转发出去。

Socket.io 客户端

在 web 前端,我们需要引入 Socket.io 客户端开启与服务端 6001 端口的通讯,并订阅频道事件:


1

2

3

4

5

6

7

8

// client.js

let io = require(&#39;socket.io-client&#39;)

 

var socket = io(&#39;:6001&#39;)

  socket.on($channel + &#39;:wechat.login&#39;, (data) => {

  socket.close()

  // save user token and redirect to dashboard

})

Nach dem Login kopieren

至此整个通讯闭环结束,开发流程看起来就是这样的:

  • 在 Laravel 中构建一个支持广播通知的事件

  • 设置需要进行广播的频道及事件名称

  • 将广播设置为使用 redis 驱动

  • 提供一个持续的服务用于订阅 redis 的发布,及将发布内容通过 WebSocket 协议推送到客户端

  • 客户端打开服务端 WebSocket 隧道,并对事件进行订阅,根据指定事件的推送进行响应。

Das obige ist der detaillierte Inhalt vonEinführung in die Implementierungsmethode zum Erstellen von Sofortanwendungen in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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