ホームページ  >  記事  >  PHPフレームワーク  >  Laravelのブロードキャストモジュールについて詳しく解説

Laravelのブロードキャストモジュールについて詳しく解説

藏色散人
藏色散人転載
2020-04-12 14:12:313959ブラウズ

この記事は、Laravel 5.4 バージョンのブロードキャスト モジュール コードの分析と作成に基づいています;

推奨: "laravel チュートリアル "

はじめに

ブロードキャストとは、送信者がメッセージを送信し、チャンネルに登録している各受信者がそのメッセージを時間内に受信できることを意味します。たとえば、学生 A が記事を書き、学生 B がその記事にコメントします。と学生 A がページにコメントしている 更新しなくても、記事にコメントが付けられた通知を受け取ることができます。これは基本的に、学生 A がブロードキャスト メッセージを受信したことを意味します。このブロードキャスト メッセージは、学生 B のコメント操作によってトリガーされます。

はブロードキャスト全体を通してブロードキャストされます。動作にはチャネルという重要な概念があります。チャネルの種類は

##● パブリック チャネル public

● プライベート チャネル private

● 存在チャネルのプレゼンス

モバイル端末がパブリック チャネル public に加入すると、成功が直接促されます。プライベート チャネルのプライベートおよび既存のチャネルのプレゼンスの加入プロセス中に、許可の検証がサーバーに送信され、チャネルに登録する権限があるかどうかを確認する; プライベート チャネル プライベート チャネル プレゼンスとの違いは、プライベート チャネル プライベートは他のメンバーから送信されたメッセージを受信できるのに対し、チャネル プレゼンスはユーザーが参加および脱退したときにメッセージも受信できることです。 #ブロードキャストは、次のシナリオに適しています (この小さな部分は、プッシャードライバーに基づく Laravel イベントブロードキャスト (パート 1) からの抜粋です):

# 通知またはシグナル

通知は最も単純な例であり、最も一般的に使用されるものが到着します。シグナルには UI がない点を除けば、シグナルは通知の一種とみなすこともできます。

#アクティビティ ストリーム

アクティビティ ストリーム (フィード) はソーシャル ネットワークの中核です。たとえば、WeChat モーメントのいいねとコメントでは、A は B のいいねをリアルタイムで見ることができ、B は A のコメントをリアルタイムで見ることができます。

# チャット

#チャット情報のリアルタイム表示

#モジュール構成

Demo

Laravelのブロードキャストモジュールについて詳しく解説##Log driver

Configuration

.env ファイルの行を変更または追加します: BROADCAST_DRIVER=log ;

Broadcast

直接呼び出し

 $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"
}

Listen to イベント ブロードキャスト

この呼び出しメソッドは、ShouldBroadcast インターフェイスを実装するイベントがトリガーされると、ブロードキャスト操作が実行されます ; (同時に、ShouldBroadcastNow というインターフェイスもあります。ShouldBroadcast インターフェイスとの違いは、ShouldBroadcastNow インターフェイスを実装するイベントがキューに入れられると、それらのイベントはキューに入れられることです。

たとえば、

最初のステップである Illuminate\Auth\Events\Login イベントは、ユーザーが正常にログインした後にトリガーされるイベントです。これを次のように少し変更します。ブロードキャスト機能を実装します;

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

2 番目のステップ、イベント監視を登録します; app/Providers/EventServiceProvider.php を変更します:

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

ファイル app/Listeners/UserLogin.php は大まかに実装されます。

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

3 番目のステップは、イベントをトリガーしてブロードキャストを送信することです。ブロードキャストをトリガーするにはいくつかの方法があります:

1. 直接イベント トリガー

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

2. ヘルプ機能ブロードキャスト、間接トリガー イベント

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

3. ブロードキャスト管理クラス、間接的にイベントをトリガー、直接ブロードキャスト

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

4. ブロードキャスト管理クラス、間接的にイベントをトリガー、キューに入れる

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

プッシャー ドライバー

プッシャーはサードパーティ サービスの場合、サーバーがブロードキャストを送信するときにプッシャーにリクエストを送信し、長い接続を通じてデータと対話します。 Pusher とブラウザまたはモバイル端末によって維持されます;

Configuration

Pusher 公式 Web サイトからユーザー情報を登録し、独自のキー情報のセットを取得し、. env 構成ファイル;

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

準備

イベント リスニング

バックグラウンドでのイベント モニタリングでは、引き続き、 「ログ駆動」部分;

フロントエンド

フロントエンド ページには次のコードが導入されています:

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

パブリックにサブスクライブする場合チャンネルの場合は、サーバーにパーミッション チェックを要求しません。プライベート チャンネル (チャンネル名が private- で始まる) またはチャンネルがある場合 (チャンネル名が Present- で始まる)、パーミッション チェック リクエストが発行されます。対応するバックエンドは、プライベート チャネルと既存のチャネルの権限を定義する必要があります。

チャネル権限の定義

チャネルの権限定義は、routes/channels.php にあります。ここで作成者は、first-channel チャネルの許可コールバック関数を定義しています。

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

読者の中には、このチャネルはフロントエンド ページ private-first-channel によってサブスクライブされているのではないかと疑問に思う人もいるかもしれません。バックエンドが最初のチャネルのアクセス許可のみを定義するのはなぜですか?これは、バックエンドによって定義されたチャネルが A であると仮定すると、Pusher に渡されるプライベート チャネルとブラウザまたはモバイル端末の名前は private-A になるためです。チャネルが存在する場合、それはプレゼンス A になります。

ブロードキャスト

##直接ブロードキャスト

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

間接ブロードキャスト

「ログ」に記載されている間接ブロードキャストを参照してください。ドリブンウェイ;

排他的なブロードキャストを送信する場合 (つまり、現在要求しているクライアント以外のブロードキャスト メッセージは受信されません)、次の条件が必要です:

1. イベントは Illuminate\Broadcasting を使用します。 \InteractsWithSockets 特性;

2. フロントエンドによって送信されるリクエスト ヘッダーには X-Socket-ID 情報が含まれている必要があります;

3. イベントがブロードキャストをトリガーします(new Illuminate\Auth\Events\Login) ($user, true)) ->toOthers();

Redis ドライバー

Configuration

.env ファイル次の行を変更または追加します: BROADCAST_DRIVER= redis;

Broadcast

原則として、バックエンドにも Socket.IO サーバーをデプロイし、Laravel フレームワークがパブリッシュします。 Socket.IO によって制御される Socket.IO サーバーへのメッセージ サーバーはブラウザーまたはモバイル端末との接続を長時間維持します;

この部分はまだデモしていませんが、非常に多くのメッセージがあります。オンラインの入門資料。原理を知っていれば、この部分のアクションを始めるのがはるかに簡単になります。

以上がLaravelのブロードキャストモジュールについて詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。