この記事は、Laravel 5.4 バージョンのブロードキャスト モジュール コードの分析と作成に基づいています;
推奨: "laravel チュートリアル"
はじめに
ブロードキャストとは、送信者がメッセージを送信し、チャンネルに登録している各受信者がそのメッセージを時間内に受信できることを意味します。たとえば、学生 A が記事を書き、学生 B がその記事にコメントします。と学生 A がページにコメントしている 更新しなくても、記事にコメントが付けられた通知を受け取ることができます。これは基本的に、学生 A がブロードキャスト メッセージを受信したことを意味します。このブロードキャスト メッセージは、学生 B のコメント操作によってトリガーされます。
はブロードキャスト全体を通してブロードキャストされます。動作にはチャネルという重要な概念があります。チャネルの種類は
##● パブリック チャネル public ● プライベート チャネル private ● 存在チャネルのプレゼンス モバイル端末がパブリック チャネル public に加入すると、成功が直接促されます。プライベート チャネルのプライベートおよび既存のチャネルのプレゼンスの加入プロセス中に、許可の検証がサーバーに送信され、チャネルに登録する権限があるかどうかを確認する; プライベート チャネル プライベート チャネル プレゼンスとの違いは、プライベート チャネル プライベートは他のメンバーから送信されたメッセージを受信できるのに対し、チャネル プレゼンスはユーザーが参加および脱退したときにメッセージも受信できることです。 #ブロードキャストは、次のシナリオに適しています (この小さな部分は、プッシャードライバーに基づく Laravel イベントブロードキャスト (パート 1) からの抜粋です): # 通知またはシグナル 通知は最も単純な例であり、最も一般的に使用されるものが到着します。シグナルには UI がない点を除けば、シグナルは通知の一種とみなすこともできます。 #アクティビティ ストリーム アクティビティ ストリーム (フィード) はソーシャル ネットワークの中核です。たとえば、WeChat モーメントのいいねとコメントでは、A は B のいいねをリアルタイムで見ることができ、B は A のコメントをリアルタイムで見ることができます。 # チャット#チャット情報のリアルタイム表示
#モジュール構成
Demo
##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'; } }
protected $listen = [ ...... 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\UserLogin', ], ];
class UserLogin { public function __construct() {} public function handle(Login $event){ \Log::info('Do UserLogin Listener: I was Login'); } }
event(new Illuminate\Auth\Events\Login($user, true));
broadcast(new Illuminate\Auth\Events\Login($user, true));
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $manager->event(new Illuminate\Auth\Events\Login($user, true));
$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
準備
イベント リスニング
バックグラウンドでのイベント モニタリングでは、引き続き、 「ログ駆動」部分;
フロントエンド
フロントエンド ページには次のコードが導入されています:チャネル権限の定義
チャネルの権限定義は、routes/channels.php にあります。ここで作成者は、first-channel チャネルの許可コールバック関数を定義しています。Broadcast::channel('first-channel', function ($user) { return (int) $user->id === 1; });
ブロードキャスト
##直接ブロードキャスト$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']);
間接ブロードキャスト
「ログ」に記載されている間接ブロードキャストを参照してください。ドリブンウェイ;
排他的なブロードキャストを送信する場合 (つまり、現在要求しているクライアント以外のブロードキャスト メッセージは受信されません)、次の条件が必要です:
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 サイトの他の関連記事を参照してください。