Heim > PHP-Framework > Laravel > Hauptteil

Detaillierte Erklärung des Broadcast-Moduls von Laravel

藏色散人
Freigeben: 2020-04-12 14:12:31
nach vorne
3958 Leute haben es durchsucht

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

Detaillierte Erklärung des Broadcast-Moduls von Laravel

Demo

Protokolltreiber

Konfiguration

.env-Datei ändern oder eine Zeile hinzufügen: BROADCAST_DRIVER =log;

Broadcast

Direkt aufrufen

 $manager = app(Illuminate\Broadcasting\BroadcastManager::class);
 $driver = $manager->connection();
 // 第一个参数是频道名,第二个参数是事件名,第三个参数是广播内容
 $driver->broadcast(['channel_1', 'channel_2'], 'login', ['message' => 'hello world']);
Nach dem Login kopieren
Da es sich um einen Protokolltreiber handelt, wird der Broadcast-Inhalt geschrieben In der vom Framework konfigurierten Protokolldatei lautet die Ausgabenachricht wie folgt

[2017-08-18 20:45:49] local.INFO: Broadcasting [login] on channels [channel_1, channel_2] with payload:
{
    "message": "hello world"
}
Nach dem Login kopieren

Ereignisübertragung abhören

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';
    }
}
Nach dem Login kopieren

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',
   ],
];
Nach dem Login kopieren

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');
    }
}
Nach dem Login kopieren

Der dritte Schritt besteht darin, Ereignisse auszulösen und Broadcasts zu senden;

1. Direkter Ereignisauslöser

event(new Illuminate\Auth\Events\Login($user, true));
Nach dem Login kopieren

2 Broadcast, indirektes Triggerereignis

broadcast(new Illuminate\Auth\Events\Login($user, true));
Nach dem Login kopieren

3. Broadcast-Verwaltungsklasse, indirektes Triggerereignis, direkte Broadcast

$manager = app(Illuminate\Broadcasting\BroadcastManager::class);
$manager->event(new Illuminate\Auth\Events\Login($user, true));
Nach dem Login kopieren

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));
Nach dem Login kopieren

Pusher-Treiber

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;

Konfiguration

Registrieren 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
Nach dem Login kopieren

Vorbereitung

Ereignisüberwachung

Backend-Ereignisüberwachung verwendet weiterhin das Anmeldebeispiel des „log-driven“. " Teil;

Front-End

Die 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(&#39;PUSHER_APP_KEY的值&#39;, {
    cluster: &#39;ap1&#39;,
    encrypted: true
});
// 定义频道,绑定事件
var channel = pusher.subscribe(&#39;private-first-channel&#39;);
channel.bind(&#39;login&#39;, function(data) {
    alert(data);
});
</script>
Nach dem Login kopieren

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.

Kanalberechtigungsdefinition

Die Berechtigungen von Kanälen werden in der Datei „routes/channels.php“ definiert Definiert die Berechtigungsrückruffunktion für den First-Channel-Kanal:

Broadcast::channel(&#39;first-channel&#39;, function ($user) {
    return (int) $user->id === 1;
});
Nach dem Login kopieren

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

Ausstrahlung

Direkte Ausstrahlung

$manager = app(Illuminate\Broadcasting\BroadcastManager::class);
$driver = $manager->connection();
// socket 参数是广播私有频道时排除的 socket, 每个浏览器端或者移动端在建立 websocket 时都会被分配一个 socket_id
$driver->broadcast([&#39;private-first-channel&#39;], &#39;login&#39;, [&#39;user&#39; => [&#39;name&#39; => &#39;hello&#39;], &#39;socket&#39; => &#39;5395.4377611&#39;]);
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:segmentfault.com
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