Laravelインスタントアプリケーションの実装方法

藏色散人
リリース: 2019-10-21 13:29:44
転載
3031 人が閲覧しました

インスタント インタラクティブ アプリケーション

最新の Web アプリケーションでは、最も一般的な支払いコールバックやサードパーティのログインなど、多くのシナリオでインスタント メッセージングの使用が必要です。これらのビジネス シナリオは、基本的に次のプロセスに従う必要があります。

# クライアントは関連ビジネスをトリガーし、サードパーティ アプリケーションの操作 (支払いなど) を生成します

# クライアントはサーバーの応答結果を待ちます(ユーザー 他社アプリの操作完了)

# 他社アプリがサーバーに処理結果を通知(決済完了)

# サーバーがクライアントに通知処理結果

# クライアントベース 結果についてのフィードバック (支払い成功ページにジャンプ)

#以前は、この種のインスタント メッセージングを実現し、クライアントが正しく応答できるようにするために処理結果に関して、最も一般的に使用されるテクノロジはポーリングでした。これは、シングルステップの HTTP プロトコルの方向性により、クライアントがサーバーに処理結果を何度も能動的に要求することしかできないためです。この方法には明らかな欠点があり、サーバー側のリソースを占有するだけでなく、サーバー側の処理結果をリアルタイムに取得することができません。

WebSocket プロトコルを使用して、リアルタイム インタラクションを処理できるようになりました。これは、サーバーがクライアントに情報をアクティブにプッシュできる双方向プロトコルです。この記事では、Laravel の強力なイベント システムを使用してリアルタイム インタラクションを構築します。次の知識が必要です:

#● Laravel Event

##● Redis

##● Socket.io

##● Node.js

#Redis

始める前に、Redis サービスを開き、Laravel アプリケーションでそれを構成して有効にする必要があります。プロセス全体を通じて、Redis のサブスクリプションおよび公開メカニズムを使用する必要があるためです。インスタントメッセージングを有効にします。

Redis は、オープンソースの効率的なキー/値ストレージ システムです。通常、キーと値のペアを保存するデータ構造サーバーとして使用され、文字列、ハッシュ、リスト、セット、および順序付けされた組み合わせをサポートできます。 Laravel で Redis を使用するには、Composer を通じて predis/predis パッケージ ファイルをインストールする必要があります。

Configuration

アプリケーション内の Redis の設定ファイルは config/database.php に保存されており、このファイル内に Redis サービス情報を含むファイルが表示されます。 redis array:

'redis' => [
  'cluster' => false,
  'default' => [
    'host' => '127.0.0.1',
    'port' => 6379,
    'database' => 0,
  ],
]
ログイン後にコピー

redis サービスのポートを変更する場合は、構成ファイル内のポートの一貫性を保ってください。

Laravel イベント

ここでは、Laravel の強力なイベント ブロードキャスト機能を使用する必要があります:

Broadcast Event

多くの最新のアプリケーションは、Web Sockets を使用してリアルタイムの対話型ユーザー インターフェイスを実装しています。サーバー上で一部のデータが変更されると、WebSocket 接続を介してメッセージがクライアントに配信され、処理されます。

このタイプのアプリケーションの構築を支援します。 Laravel を使用すると、WebSocket 接続経由でイベントを簡単にブロードキャストできます。 Laravel を使用すると、イベントをブロードキャストして、サーバー側およびクライアント側の JavaScript フレームワークにイベント名を共有できます。

設定

すべてのイベント ブロードキャスト設定オプションは、config/broadcasting.php 設定ファイルに保存されます。 Laravel には、Pusher、Redis、Log などの利用可能なドライバーがいくつか付属していますが、ここでは Redis をブロードキャスト ドライバーとして使用します。これには、predis/predis クラス ライブラリが必要です。

デフォルトのブロードキャスト ドライバーはプッシャーを使用するため、.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 &#39;wechat.login&#39;;
    }
}
ログイン後にコピー

broadcastOn メソッドは、ブロードキャストされるチャネルを表す配列を返す必要があることに注意する必要があります。 BroadcastingAs は、ブロードキャストによってトリガーされたイベントを表す文字列を返します。Laravel のデフォルトでは、イベント クラスの完全なクラス名が返されます。ここでは、App\Events\WechatLoginedEvent です。

最も重要なことは、次のことが必要であることです。このクラスに ShouldBroadcast コントラクトを実装させます。 Laravel はイベント生成時にこの名前空間を自動的に追加しており、このコントラクトはブロードキャストオン メソッドのみを制約します。

イベントが完了したら、次のステップはイベントをトリガーすることです。単純なコード行で十分です:

event(new WechatLoginedEvent($token, $channel));
ログイン後にコピー

この操作は自動的にイベントの実行をトリガーし、情報をブロードキャストします。 。基礎となるブロードキャスト操作は、redis のサブスクリプションおよび公開メカニズムに依存します。 RedisBroadcaster は、指定されたチャネルを通じてイベント内の一般にアクセス可能なデータを公開します。公開されたデータをより詳細に制御したい場合は、broadcastWith メソッドをイベントに追加すると、配列

/**
 * Get the data to broadcast.
 *
 * @return array
 */
 public function broadcastWith() 
 {
   return [&#39;user&#39; => $this->user->id];
 }
ログイン後にコピー

#Node.js および Socket.io

## が返されます。

#公開された情報については、Redis パブリケーションをサブスクライブし、WebSocket プロトコルを使用して情報を転送できるように接続するサービスが必要です。ここでは、Node.js とソケット.io を借用できます。これは非常に便利です。このサービスを構築します:

// server.js
var app = require(&#39;http&#39;).createServer(handler);
var io = require(&#39;socket.io&#39;)(app);
var Redis = require(&#39;ioredis&#39;);
var redis = new Redis();
app.listen(6001, function () {
  console.log(&#39;Server is running!&#39;) ;
});
function handler(req, res) {
  res.writeHead(200);
  res.end(&#39;&#39;);
}
io.on(&#39;connection&#39;, function (socket) {
  socket.on(&#39;message&#39;, function (message) {
    console.log(message)
  })
  socket.on(&#39;disconnect&#39;, function () {
    console.log(&#39;user disconnect&#39;)
  })
});
redis.psubscribe(&#39;*&#39;, function (err, count) {
});
redis.on(&#39;pmessage&#39;, function (subscrbed, channel, message) {
  message = JSON.parse(message);
  io.emit(channel + &#39;:&#39; + message.event, message.data);
});
ログイン後にコピー

ここでは、Node.js を使用して、socket.io サーバーを導入し、6001 ポートをリッスンします。redis の psubscribe コマンドを借用して、ワイルドカードを使用してバッチで迅速にサブスクライブします。メッセージがトリガーされ、メッセージは WebSocket 経由で転送されます。

Socket.io クライアント

Web フロントエンドでは、サーバー ポート 6001 との通信を開始し、チャネルにサブスクライブするために、Socket.io クライアントを導入する必要があります。 events:

// client.js
let io = require(&#39;socket.io-client&#39;)
var socket = io(&#39;:6001&#39;)
      socket.on($channel + &#39;:wechat.login&#39;, (data) => {
        socket.close()
        // save user token and redirect to dashboard
})
ログイン後にコピー

閉じた通信ループ全体が終了し、開発プロセスは次のようになります:

# ブロードキャスト通知をサポートする Laravel でイベントを構築する

#● ブロードキャストする必要があるチャネルとイベント名を設定する

#● Redis ドライバーを使用するようにブロードキャストを設定する

● Redis パブリケーションをサブスクライブするための継続的なサービスを提供し、WebSocket プロトコルを通じてパブリッシュされたコンテンツをクライアントにプッシュします。

## クライアントはサーバーの WebSocket トンネルを開き、イベントをサブスクライブし、指定されたイベントを応答する。

Laravel 関連の技術記事の詳細については、

Laravel Framework Getting Started Tutorial

列にアクセスして学習してください。

以上がLaravelインスタントアプリケーションの実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!