Dieser Artikel basiert auf der Analyse und dem Schreiben des Broadcast-Modulcodes der Laravel 5.4-Version
Empfohlen: „Laravel-Tutorial“
Einführung
Rundfunk bedeutet, dass der Absender eine Nachricht sendet und jeder Empfänger, der den Kanal abonniert, die Nachricht rechtzeitig empfangen kann. Beispielsweise schreibt Schüler A einen Artikel und Schüler B kommentiert den Artikel. und Student A kommentiert auf der Seite Sie können Benachrichtigungen erhalten, dass ein Artikel kommentiert wurde, ohne ihn zu aktualisieren. Dies bedeutet im Wesentlichen, dass Student A eine Broadcast-Nachricht erhalten hat, die durch die Aktion von Student B ausgelöst wird 🎜> wird während der gesamten Sendung ausgestrahlt. Es gibt ein wichtiges Konzept namens Kanal. Die Kanaltypen sind
● öffentlicher Kanal
● privater Kanal privat
● Existenz des Kanals Präsenz
Wenn das mobile Endgerät den öffentlichen Kanal öffentlich abonniert, wird beim Abonnementvorgang des privaten Kanals Privat und Präsenz des Kanals direkt eine Berechtigungsüberprüfung an den gesendet Der Server prüft, ob er über die Berechtigung zum Abonnieren des Kanals verfügt. Der Unterschied zum privaten Kanal „Presence“ besteht darin, dass der private Kanal „Private“ Nachrichten empfangen kann, die von anderen Mitgliedern gesendet wurden, während der private Kanal „Presence“ auch Informationen empfangen kann, wenn der Benutzer tritt bei und geht;
Broadcasting eignet sich für die folgenden Szenarien (Dieser kleine Teil ist ein Auszug aus der Laravel-Eventübertragung basierend auf Pusher Driver (Teil 1)):
● Benachrichtigung oder Signal
Benachrichtigung ist das einfachste Beispiel und wird am häufigsten verwendet. Signale können auch als eine Form der Benachrichtigung angesehen werden, mit der Ausnahme, dass Signale keine Benutzeroberfläche haben.
● Aktivitätsstreams
Aktivitätsstreams (Feeds) sind der Kern sozialer Netzwerke. Beispielsweise kann A bei Likes und Kommentaren in WeChat Moments die Likes von B in Echtzeit sehen und B kann die Kommentare von A in Echtzeit sehen.
● Chat
Echtzeitanzeige von Chat-Informationen
Modulzusammensetzung
Demo
Protokolltreiber
Konfiguration
.env-Datei ändern oder eine Zeile hinzufügen: BROADCAST_DRIVER =log;
BroadcastDirekt aufrufen
$manager = app(Illuminate\Broadcasting\BroadcastManager::class);
$driver = $manager->connection();
// 第一个参数是频道名,第二个参数是事件名,第三个参数是广播内容
$driver->broadcast(['channel_1', 'channel_2'], 'login', ['message' => 'hello world']);
[2017-08-18 20:45:49] local.INFO: Broadcasting [login] on channels [channel_1, channel_2] with payload: { "message": "hello world" }
Diese Aufrufmethode ist, dass bei einem Ereignis das ShouldBroadcast implementiert wird Wenn die Schnittstelle ausgelöst wird, wird ein Broadcast-Vorgang ausgeführt. (Gleichzeitig gibt es auch eine Schnittstelle namens ShouldBroadcastNow. Der Unterschied zur ShouldBroadcast-Schnittstelle besteht darin, dass Ereignisse, die die ShouldBroadcastNow-Schnittstelle implementieren, in die Warteschlange gestellt werden in die Warteschlange namens sync)
Zum Beispiel
Der erste Schritt, das IlluminateAuthEventsLogin-Ereignis, ist ein Ereignis, das ausgelöst wird, nachdem sich der Benutzer erfolgreich angemeldet hat. Es wird leicht geändert, um dies zu ermöglichen Implementieren Sie die Broadcast-Funktion.
class Login implements ShouldBroadcast { ...... // 定义事件被触发时,广播频道;此处定义名为 first-channel 的私有频道 public function broadcastOn() { return [ new PrivateChannel('first-channel'), ]; } // 自定义广播名称;如果方法未定义,默认以类名为事件名,此处的默认值是 Illuminate\Auth\Events\Login public function broadcastAs() { return 'login'; } }
Der zweite Schritt besteht darin, den Ereignis-Listener in app/Modify in Providers/EventServiceProvider.php zu registrieren:
protected $listen = [ ...... 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\UserLogin', ], ];
Die Datei app/Listeners/UserLogin.php Grob implementiert:
class UserLogin { public function __construct() {} public function handle(Login $event){ \Log::info('Do UserLogin Listener: I was Login'); } }
Der dritte Schritt besteht darin, Ereignisse auszulösen und Broadcasts zu senden;
1. Direkter Ereignisauslöser
event(new Illuminate\Auth\Events\Login($user, true));
2 Broadcast, indirektes Triggerereignis
broadcast(new Illuminate\Auth\Events\Login($user, true));
3. Broadcast-Verwaltungsklasse, indirektes Triggerereignis, direkte Broadcast
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $manager->event(new Illuminate\Auth\Events\Login($user, true));
4. Broadcast-Verwaltungsklasse, löst indirekt Ereignisse aus und stellt sie in die Warteschlange
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $manager->queue(new Illuminate\Auth\Events\Login($user, true));
Pusher ist ein vom Server gesendeter Drittanbieterdienst. Beim Senden wird eine Anfrage an Pusher gesendet, und dann werden Daten über die lange aufrechterhaltene Verbindung ausgetauscht über Pusher und den Browser oder das mobile Endgerät;
KonfigurationRegistrieren Sie Benutzer über die offiziellen Website-Informationen von Pusher, erhalten Sie Ihre eigenen Schlüsselinformationen und ändern Sie die .env-Konfiguration Datei;
BROADCAST_DRIVER=pusher PUSHER_APP_ID=xxxxxxxxxxxxxxxxxxxxxx PUSHER_APP_KEY=xxxxxxxxxxxxxxxxxxxxxx PUSHER_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxx
Ereignisüberwachung
Backend-Ereignisüberwachung verwendet weiterhin das Anmeldebeispiel des „log-driven“. " Teil;
Front-EndDie Front-End-Seite führt den folgenden Code ein:
<script src="https://js.pusher.com/4.1/pusher.min.js"></script> <script> // 打开 Pusher 的调试日志 Pusher.logToConsole = true; // 定义 Pusher 变量 var pusher = new Pusher('PUSHER_APP_KEY的值', { cluster: 'ap1', encrypted: true }); // 定义频道,绑定事件 var channel = pusher.subscribe('private-first-channel'); channel.bind('login', function(data) { alert(data); }); </script>
Wenn das Abonnement einen öffentlichen Kanal betrifft, Es wird keine Berechtigungsprüfung vom Server angefordert. Wenn es sich um einen privaten Kanal handelt (der Kanalname beginnt mit „private-“) oder wenn es einen Kanal gibt (der Kanalname beginnt mit „presence-“), wird eine entsprechende Anforderung zur Berechtigungsprüfung ausgegeben Das Backend muss die Berechtigungen privater Kanäle und vorhandener Kanäle definieren.
KanalberechtigungsdefinitionDie Berechtigungen von Kanälen werden in der Datei „routes/channels.php“ definiert Definiert die Berechtigungsrückruffunktion für den First-Channel-Kanal:
Broadcast::channel('first-channel', function ($user) { return (int) $user->id === 1; });
Einige Leser fragen sich vielleicht, ob der von der Front-End-Seite abonnierte Kanal nicht ein Private-First-Channel ist? Warum definiert das Backend nur die Berechtigungen des First-Channel-Kanals? Das liegt daran, dass unter der Annahme, dass der vom Backend definierte Kanal A ist, der in Pusher übergebene private Kanal den Namen private-A trägt. Wenn der Kanal vorhanden ist, ist er Presence-A
AusstrahlungDirekte Ausstrahlung
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $driver = $manager->connection(); // socket 参数是广播私有频道时排除的 socket, 每个浏览器端或者移动端在建立 websocket 时都会被分配一个 socket_id $driver->broadcast(['private-first-channel'], 'login', ['user' => ['name' => 'hello'], 'socket' => '5395.4377611']);
Indirekte Ausstrahlung
Siehe die in „ „Protokollgesteuerte“ Methode; Wenn Sie eine exklusive Übertragung senden möchten (d. h. es wird keine Broadcast-Nachricht empfangen, außer für den aktuell anfordernden Client), benötigen Sie die folgenden Bedingungen: 1 Das Ereignis verwendet die Eigenschaft IlluminateBroadcastingInteractsWithSockets; 2. Der vom Frontend gesendete Anforderungsheader muss X-Socket-ID-Informationen enthalten 3. Das Ereignis löst Broadcast(new IlluminateAuthEventsLogin($user, true))-> toOthers(); Redis-Treiber Konfiguration .env-Datei Ändern oder fügen Sie eine Zeile hinzu: BROADCAST_DRIVER=redis; Broadcast Das Prinzip besteht darin, auch einen Socket.IO-Server im Backend bereitzustellen. Das Laravel-Framework veröffentlicht Nachrichten auf dem Socket.IO-Server und dem Socket Der .IO-Server hält die Kommunikation mit dem Browser oder mobilen Endgerät langfristig aufrecht. Der Autor hat diesen Teil noch nicht vorgeführt, und es gibt eine ganze Reihe von Einführungsmaterialien online. Es wird viel einfacher sein, mit diesem Teil der Aktion zu beginnen
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des Broadcast-Moduls von Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!