Laravel のインスタント アプリケーションを構築する方法の紹介
この記事では、日常の開発で頻繁に使用されるインスタント メッセージングの実装方法を中心に紹介します。必要な方は参考にしてください。以下編集者。
インスタント対話型アプリケーション
最も一般的な支払いコールバックやサードパーティのログインなど、最新の 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));
この操作は自動的にイベントの実行をトリガーし、情報をブロードキャストします。このブロードキャスト操作の最下層は、redis のサブスクリプションおよび公開メカニズムに依存しています。
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 隧道,并对事件进行订阅,根据指定事件的推送进行响应。 总结 以上がLaravel のインスタント アプリケーションを構築する方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。// 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
})

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Laravelの電子メールの送信が失敗したときに戻りコードを取得する方法。 Laravelを使用してアプリケーションを開発する場合、検証コードを送信する必要がある状況に遭遇することがよくあります。そして実際には...

LaravelスケジュールタスクRAN RANSPONSIVEトラブルシューティングRALAVELのスケジュールタスクスケジューリングを使用すると、多くの開発者がこの問題に遭遇します。スケジュール:実行...

Laravelの電子メールの検証コードの送信の障害を処理する方法は、Laravelを使用することです...

DCATを使用するときにDCATADMIN(Laravel-Admin)にデータを追加するためにカスタムクリックのテーブル関数を実装する方法...

Laravel FrameworkでRedis接続の共有の影響とLaravelフレームワークとRedisを使用する際のメソッドを選択すると、開発者は問題に遭遇する可能性があります。

LaravelEloquentモデルの検索:データベースデータを簡単に取得するEloquentormは、データベースを操作するための簡潔で理解しやすい方法を提供します。この記事では、さまざまな雄弁なモデル検索手法を詳細に紹介して、データベースからのデータを効率的に取得するのに役立ちます。 1.すべてのレコードを取得します。 ALL()メソッドを使用して、データベーステーブルですべてのレコードを取得します:useapp \ models \ post; $ post = post :: all();これにより、コレクションが返されます。 Foreach Loopまたはその他の収集方法を使用してデータにアクセスできます。

Laravel Multi-Tenant拡張機能パッケージStancl/Tenancyのカスタムテナントデータベース接続Laravel Multi-Tenant ExtensionパッケージStancl/Tenancyを使用したマルチテナントアプリケーションを構築する際の...

700万のレコードを効率的に処理し、地理空間技術を使用したインタラクティブマップを作成します。この記事では、LaravelとMySQLを使用して700万を超えるレコードを効率的に処理し、それらをインタラクティブなマップの視覚化に変換する方法について説明します。最初の課題プロジェクトの要件:MySQLデータベースに700万のレコードを使用して貴重な洞察を抽出します。多くの人は最初に言語をプログラミングすることを検討しますが、データベース自体を無視します。ニーズを満たすことができますか?データ移行または構造調整は必要ですか? MySQLはこのような大きなデータ負荷に耐えることができますか?予備分析:キーフィルターとプロパティを特定する必要があります。分析後、ソリューションに関連している属性はわずかであることがわかりました。フィルターの実現可能性を確認し、検索を最適化するためにいくつかの制限を設定しました。都市に基づくマップ検索
