この記事では、日常の開発で頻繁に使用されるインスタント メッセージングの実装方法を中心に紹介します。必要な方は参考にしてください。以下編集者。
インスタント対話型アプリケーション
最も一般的な支払いコールバックやサードパーティのログインなど、最新の Web アプリケーションの多くのシナリオでインスタント メッセージングが必要であることは誰もが経験しているはずです。これらのビジネス シナリオは基本的に次のプロセスに従う必要があります:
クライアントは関連ビジネスをトリガーし、サードパーティ アプリケーションの操作 (支払いなど) を生成します
クライアントはサーバーの応答結果を待ちます (ユーザーが操作を完了します)サードパーティアプリの処理結果))
サードパーティアプリがサーバーに処理結果を通知(決済完了)
サーバーがクライアントに処理結果を通知
クライアントがフィードバック結果に基づいて (支払い成功ページにジャンプします)
これまで、この種のインスタント メッセージングを実現し、クライアントが処理結果に正しく応答できるようにするために、最も一般的に使用されていたテクノロジはポーリングでした。 HTTP プロトコルの一方向の性質により、クライアントは積極的にサーバーに処理結果を何度も要求することしかできません。この方法には明らかな欠陥があり、サーバー側のリソースを占有するだけでなく、サーバー側の処理結果をリアルタイムで取得することもできません。
WebSocket プロトコルを使用して、リアルタイムの対話を処理できるようになりました。これは、サーバーがクライアントに情報をアクティブにプッシュできるようにする双方向プロトコルです。この記事では、Laravel の強力なイベント システムを使用してリアルタイム インタラクションを構築します。次の知識が必要になります:
Laravel Event
Redis
Socket.io
Node.js
Redis
始める前に、 redis サービスを作成し、Laravel アプリケーションで設定して有効にします。プロセス全体を通じて、インスタント メッセージングを実現するために Redis のサブスクリプションおよび公開メカニズムを使用する必要があるためです。
Redis は、オープンソースの効率的なキー/値ストレージ システムです。通常、キーと値のペアを保存するデータ構造サーバーとして使用され、文字列、ハッシュ、リスト、セット、および順序付けされた組み合わせをサポートできます。 Laravel で Redis を使用するには、Composer を通じて predis/predis パッケージ ファイルをインストールする必要があります。
構成
アプリケーションの Redis の構成ファイルは config/database.php に保存されており、このファイルには Redis サービス情報を含む Redis 配列が表示されます:
'redis' => [ 'cluster' => false, 'default' => [ 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, ], ]
Redis サービスのポートを変更しました。構成ファイル内のポートを一貫したものにしてください。
Laravel Event
ここでは、Laravel の強力なイベントブロードキャスト機能を使用する必要があります:
Broadcast Events
多くの最新のアプリケーションは、Web ソケットを使用してリアルタイムの対話型ユーザーインターフェイスを実装しています。サーバー上で一部のデータが変更されると、WebSocket 接続を介してメッセージがクライアントに配信され、処理されます。
このタイプのアプリケーションの構築を支援します。 Laravel を使用すると、WebSocket 接続経由でイベントを簡単にブロードキャストできます。 Laravel を使用すると、イベントをブロードキャストして、サーバー側およびクライアント側の JavaScript フレームワークにイベント名を共有できます。
設定
すべてのイベントブロードキャスト設定オプションは、config/broadcasting.php 設定ファイルに保存されます。 Laravel には、Pusher、Redis、Log などの利用可能なドライバーがいくつか付属しています。ここでは、predis/predis クラス ライブラリを必要とするブロードキャスト ドライバーとして Redis を使用します。
デフォルトのブロードキャストドライバーはプッシャーを使用するため、.envファイルで設定する必要があります BROADCAST_DRIVER=redis
。
ユーザーが WeChat をスキャンしてログインした後にブロードキャストする WechatLoginedEvent イベント クラスを作成します。
<?php namespace App\Events; use App\Events\Event; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class WechatLoginedEvent extends Event implements ShouldBroadcast { use SerializesModels; public $token; protected $channel; /** * Create a new event instance. * * @param string $token * @param string $channel * @return void */ public function __construct($token, $channel) { $this->token = $token; $this->channel = $channel; } /** * Get the channels the event should be broadcast on. * * @return array */ public function broadcastOn() { return [$this->channel]; } /** * Get the name the event should be broadcast on. * * @return string */ public function broadcastAs() { return 'wechat.login'; } }
broadcastOn メソッドはブロードキャストするチャネルを表す配列を返す必要があるのに対し、broadcastAs はブロードキャストによってトリガーされたイベントを表す文字列。Laravel はデフォルトでイベント クラスの完全なクラス名を返します。最も重要なことは、このクラスに ShouldBroadcast コントラクトを実装する必要があることです。 Laravel はイベント生成時にこの名前空間を自動的に追加しており、このコントラクトはブロードキャストオン メソッドのみを制約します。
イベントが完了したら、次のステップはイベントをトリガーすることです:
event(new WechatLoginedEvent($token, $channel));
RedisBroadcaster は、指定されたチャネルを通じてイベント内の一般にアクセス可能なデータを公開します。公開されたデータをより詳細に制御したい場合は、イベントにBroadcastWithメソッドを追加できます。これにより配列が返されます:
/** * Get the data to broadcast. * * @return array */ public function broadcastWith() { return ['user' => $this->user->id]; }
Node.jsおよびSocket.io 对于发布出去的信息,我们需要一个服务来对接,让其能对 redis 的发布能够进行订阅,并且能把信息以 WebSocket 协议转发出去,这里我们可以借用 Node.js 和 socket.io 来非常方便的构建这个服务: 这里我们使用 Node.js 引入 socket.io 服务端并监听 6001 端口,借用 redis 的 psubscribe 指令使用通配符来快速的批量订阅,接着在消息触发时将消息通过 WebSocket 转发出去。 Socket.io 客户端 在 web 前端,我们需要引入 Socket.io 客户端开启与服务端 6001 端口的通讯,并订阅频道事件: 至此整个通讯闭环结束,开发流程看起来就是这样的: 在 Laravel 中构建一个支持广播通知的事件 设置需要进行广播的频道及事件名称 将广播设置为使用 redis 驱动 提供一个持续的服务用于订阅 redis 的发布,及将发布内容通过 WebSocket 协议推送到客户端 客户端打开服务端 WebSocket 隧道,并对事件进行订阅,根据指定事件的推送进行响应。// server.js
var app = require('http').createServer(handler);
var io = require('socket.io')(app);
var Redis = require('ioredis');
var redis = new Redis();
app.listen(6001, function () {
console.log('Server is running!') ;
});
function handler(req, res) {
res.writeHead(200);
res.end('');
}
io.on('connection', function (socket) {
socket.on('message', function (message) {
console.log(message)
})
socket.on('disconnect', function () {
console.log('user disconnect')
})
});
redis.psubscribe('*', function (err, count) {
});
redis.on('pmessage', function (subscrbed, channel, message) {
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
// client.js
let io = require('socket.io-client')
var socket = io(':6001')
socket.on($channel + ':wechat.login', (data) => {
socket.close()
// save user token and redirect to dashboard
})
以上がLaravelでインスタントアプリを構築する実装方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。