Maison  >  Article  >  cadre php  >  Explication détaillée du module de diffusion de Laravel

Explication détaillée du module de diffusion de Laravel

藏色散人
藏色散人avant
2020-04-12 14:12:313883parcourir

Cet article est basé sur l'analyse et l'écriture du code du module de diffusion de la version Laravel 5.4

Recommandé : "tutoriel laravel"

Introduction ;

La diffusion signifie que l'expéditeur envoie un message, et chaque destinataire qui s'abonne à la chaîne peut recevoir le message à temps ; par exemple, l'étudiant A écrit un article et l'étudiant B commente sous l'article ; et les commentaires de l'étudiant A sur la page Vous pouvez recevoir des notifications indiquant qu'un article a été commenté sans rafraîchir. Cela signifie essentiellement que l'étudiant A a reçu un message diffusé. Ce message diffusé est déclenché par l'action du commentaire de l'étudiant B ; 🎜> est diffusé tout au long de la diffusion. Dans le comportement, il existe un concept important appelé chaîne. Les types de chaînes sont

● chaîne publique publique

● chaîne privée privée

● Présence du canal d'existence

Si le terminal mobile s'abonne au canal public, cela déclenchera directement le succès lors du processus d'abonnement du canal privé privé et de la présence du canal d'existence, une vérification de l'autorisation sera envoyée au serveur pour voir s'il a la permission de s'abonner au canal ; le canal privé privé La différence avec le canal d'existence est que le canal privé privé peut recevoir des messages envoyés par d'autres membres, tandis que le canal d'existence peut également recevoir des informations lorsque l'utilisateur rejoint et quitte

La diffusion convient aux scénarios suivants (cette petite partie est extraite de la diffusion d'un événement Laravel basée sur le pilote Pusher (partie 1)) :

● Notification ou signal

La notification est l'exemple le plus simple et le plus couramment utilisé. Les signaux peuvent également être considérés comme une forme de notification, sauf qu'ils n'ont pas d'interface utilisateur.

● Flux d'activité

Les flux d'activité (flux) sont au cœur des réseaux sociaux. Par exemple, pour les likes et les commentaires dans WeChat Moments, A peut voir les likes de B en temps réel et B peut voir les commentaires de A en temps réel.

Quantity Chat

Affichage en temps réel des informations de chat

Composition du module

Explication détaillée du module de diffusion de LaravelDémo

Log driver

Configuration

Fichier .env modifier ou ajouter une ligne : BROADCAST_DRIVER =log;

Diffusion

Appelez directement

 $manager = app(Illuminate\Broadcasting\BroadcastManager::class);
 $driver = $manager->connection();
 // 第一个参数是频道名,第二个参数是事件名,第三个参数是广播内容
 $driver->broadcast(['channel_1', 'channel_2'], 'login', ['message' => 'hello world']);
Parce qu'il s'agit d'un pilote de journal, le contenu de la diffusion sera écrit au fichier journal configuré par le framework, le message de sortie est le suivant
[2017-08-18 20:45:49] local.INFO: Broadcasting [login] on channels [channel_1, channel_2] with payload:
{
    "message": "hello world"
}

Écoute de la diffusion d'un événement

Cette méthode d'appel est celle lorsqu'un événement qui implémente ShouldBroadcast est déclenchée, une opération de diffusion sera effectuée (en même temps, il existe également une interface appelée ShouldBroadcastNow. La différence avec l'interface ShouldBroadcast est que lorsque les événements qui implémentent l'interface ShouldBroadcastNow sont mis dans la file d'attente, ils seront mis dans la file d'attente appelée sync)

Par exemple,

La première étape, l'événement IlluminateAuthEventsLogin est un événement qui sera déclenché une fois que l'utilisateur s'est connecté avec succès. Il est légèrement modifié pour lui permettre de le faire. implémentez la fonction de diffusion ;

class Login implements ShouldBroadcast {
    ......
    
    // 定义事件被触发时,广播频道;此处定义名为 first-channel 的私有频道
    public function broadcastOn() {
        return [
            new PrivateChannel('first-channel'),
        ];
    }
    
    // 自定义广播名称;如果方法未定义,默认以类名为事件名,此处的默认值是 Illuminate\Auth\Events\Login
    public function broadcastAs() {
        return 'login';
    }
}

La deuxième étape consiste à enregistrer l'écouteur d'événement ; dans app/Modify dans Providers/EventServiceProvider.php :

protected $listen = [
   ......
   'Illuminate\Auth\Events\Login' => [
        'App\Listeners\UserLogin',
   ],
];

Le fichier app/Listeners/UserLogin.php est implémenté grossièrement :

class UserLogin {
    public function __construct() {}
    
    public function handle(Login $event){
        \Log::info('Do UserLogin Listener: I was Login');
    }
}

La troisième étape consiste à déclencher des événements et à envoyer des diffusions ; il existe plusieurs méthodes de diffusion de déclenchement :

1 Déclencheur d'événement direct

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

2. diffusion, événement déclencheur indirect

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

3. Classe de gestion de diffusion, événement déclencheur indirect, diffusion directe

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

4. Classe de gestion de diffusion, déclenchant indirectement des événements et les mettant dans la file d'attente

$manager = app(Illuminate\Broadcasting\BroadcastManager::class);
$manager->queue(new Illuminate\Auth\Events\Login($user, true));
.

Pilote Pusher

Pusher est un service tiers envoyé par le serveur Lors de la diffusion, une requête sera envoyée à Pusher, puis les données seront échangées via la longue connexion maintenue par Pusher et le navigateur ou le terminal mobile ;

Configuration

Enregistrez les utilisateurs via les informations du site officiel de Pusher, obtenez votre propre ensemble d'informations clés et modifiez la configuration .env. file;

BROADCAST_DRIVER=pusher
PUSHER_APP_ID=xxxxxxxxxxxxxxxxxxxxxx
PUSHER_APP_KEY=xxxxxxxxxxxxxxxxxxxxxx
PUSHER_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxx

Préparation

Surveillance des événements

La surveillance des événements backend utilise toujours l'exemple de connexion du "log-driven" " partie ;

Front-end

La page front-end introduit le code suivant :

<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>

Si l'abonnement est à une chaîne publique, aucun contrôle d'autorisation ne sera demandé au serveur ; s'il s'agit d'un canal privé (le nom du canal commence par private-) ou s'il existe un canal (le nom du canal commence par présence-), une demande de contrôle d'autorisation sera émise ; le backend doit définir les autorisations des chaînes privées et des chaînes existantes ;

Définition des autorisations des chaînes

Les autorisations des chaînes sont définies dans routes/channels.php ceci L'auteur ; définit la fonction de rappel d'autorisation pour le canal du premier canal :

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

Certains lecteurs peuvent se demander si le canal auquel la page frontale est abonnée n'est-il pas un canal privé ? Pourquoi le backend définit-il uniquement les autorisations du canal du premier canal ? En effet, en supposant que le canal défini par le backend est A, alors le canal privé transmis dans Pusher et le navigateur ou le terminal mobile est nommé private-A. Si le canal existe, ce sera présence-A ;

Diffusion

Diffusion directe

$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;]);

Diffusion indirecte

Se référer à la diffusion indirecte mentionnée dans " Méthode "Log Driven" ;

Si vous souhaitez envoyer une diffusion exclusive (c'est-à-dire qu'aucun message de diffusion ne sera reçu sauf pour le client qui le demande actuellement), vous avez besoin des conditions suivantes :

1 L'événement utilise le trait IlluminateBroadcastingInteractsWithSockets ;

2. L'en-tête de requête envoyé par le front-end doit contenir des informations X-Socket-ID

3. L'événement déclenche la diffusion (new IlluminateAuthEventsLogin($user, true))-> toAutres();

Pilote Redis

Configuration

Fichier .env Modifier ou ajouter une ligne : BROADCAST_DRIVER=redis;

Broadcast

Le principe est de déployer également un serveur Socket.IO sur le backend Le framework Laravel publiera les messages sur le serveur Socket.IO, et le Socket. Le serveur .IO maintiendra une communication à long terme avec le navigateur ou le terminal mobile ;

L'auteur n'a pas encore fait de démonstration de cette partie, et il existe de nombreux documents d'introduction en ligne. il sera beaucoup plus facile de se lancer dans cette partie de l'action

;

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer