検索
ホームページバックエンド開発PHPチュートリアル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 &#39;wechat.login&#39;;
 }
}

broadcastOn メソッドはブロードキャストするチャネルを表す配列を返す必要があるのに対し、broadcastAs はブロードキャストによってトリガーされたイベントを表す文字列。Laravel はデフォルトでイベント クラスの完全なクラス名を返します。最も重要なことは、このクラスに 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 和 socket.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 前端,我们需要引入 Socket.io 客户端开启与服务端 6001 端口的通讯,并订阅频道事件:


// 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 のインスタント アプリケーションを構築する方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPの抽象クラスまたはインターフェイスに対して、いつ特性を使用しますか?PHPの抽象クラスまたはインターフェイスに対して、いつ特性を使用しますか?Apr 10, 2025 am 09:39 AM

PHPでは、特性は方法が必要な状況に適していますが、継承には適していません。 1)特性により、クラスの多重化方法が複数の継承の複雑さを回避できます。 2)特性を使用する場合、メソッドの競合に注意を払う必要があります。メソッドの競合は、代替およびキーワードとして解決できます。 3)パフォーマンスを最適化し、コードメンテナビリティを改善するために、特性の過剰使用を避け、その単一の責任を維持する必要があります。

依存関係噴射コンテナ(DIC)とは何ですか?また、なぜPHPで使用するのですか?依存関係噴射コンテナ(DIC)とは何ですか?また、なぜPHPで使用するのですか?Apr 10, 2025 am 09:38 AM

依存関係噴射コンテナ(DIC)は、PHPプロジェクトで使用するオブジェクト依存関係を管理および提供するツールです。 DICの主な利点には、次のものが含まれます。1。デカップリング、コンポーネントの独立したもの、およびコードの保守とテストが簡単です。 2。柔軟性、依存関係を交換または変更しやすい。 3.テスト可能性、単体テストのために模擬オブジェクトを注入するのに便利です。

通常のPHPアレイと比較して、SPL SPLFIXEDARRAYとそのパフォーマンス特性を説明してください。通常のPHPアレイと比較して、SPL SPLFIXEDARRAYとそのパフォーマンス特性を説明してください。Apr 10, 2025 am 09:37 AM

SplfixedArrayは、PHPの固定サイズの配列であり、高性能と低いメモリの使用が必要なシナリオに適しています。 1)動的調整によって引き起こされるオーバーヘッドを回避するために、作成時にサイズを指定する必要があります。 2)C言語アレイに基づいて、メモリと高速アクセス速度を直接動作させます。 3)大規模なデータ処理とメモリに敏感な環境に適していますが、サイズが固定されているため、注意して使用する必要があります。

PHPは、ファイルを安全に処理する方法をどのように処理しますか?PHPは、ファイルを安全に処理する方法をどのように処理しますか?Apr 10, 2025 am 09:37 AM

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

Null Coulescingオペレーター(??)およびNull Coulescing Assignment Operator(?? =)とは何ですか?Null Coulescingオペレーター(??)およびNull Coulescing Assignment Operator(?? =)とは何ですか?Apr 10, 2025 am 09:33 AM

JavaScriptでは、nullcoalescingoperator(??)およびnullcoalescingsignmentoperator(?? =)を使用できます。 1.??最初の非潜水金または非未定されたオペランドを返します。 2.??これらの演算子は、コードロジックを簡素化し、読みやすさとパフォーマンスを向上させます。

コンテンツセキュリティポリシー(CSP)ヘッダーとは何ですか?なぜ重要なのですか?コンテンツセキュリティポリシー(CSP)ヘッダーとは何ですか?なぜ重要なのですか?Apr 09, 2025 am 12:10 AM

XSS攻撃を防ぎ、リソースのロードを制限し、ウェブサイトのセキュリティを改善できるため、CSPは重要です。 1.CSPはHTTP応答ヘッダーの一部であり、厳格なポリシーを通じて悪意のある行動を制限します。 2。基本的な使用法は、同じ起源からのロードリソースのみを許可することです。 3.高度な使用法は、特定のドメイン名がスクリプトやスタイルをロードできるようにするなど、より微調整された戦略を設定できます。 4。CSPポリシーをデバッグおよび最適化するには、コンテンツセキュリティポリシーレポートのみのヘッダーを使用します。

HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか?HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか?Apr 09, 2025 am 12:09 AM

HTTPリクエストメソッドには、それぞれリソースを取得、送信、更新、削除するために使用されるGET、POST、PUT、および削除が含まれます。 1. GETメソッドは、リソースを取得するために使用され、読み取り操作に適しています。 2. POSTメソッドはデータの送信に使用され、新しいリソースを作成するためによく使用されます。 3. PUTメソッドは、リソースの更新に使用され、完全な更新に適しています。 4.削除メソッドは、リソースの削除に使用され、削除操作に適しています。

HTTPSとは何ですか、なぜWebアプリケーションにとって重要なのですか?HTTPSとは何ですか、なぜWebアプリケーションにとって重要なのですか?Apr 09, 2025 am 12:08 AM

HTTPSは、HTTPに基づいてセキュリティレイヤーを追加するプロトコルであり、主に暗号化されたデータを介してユーザーのプライバシーとデータセキュリティを保護します。その作業原則には、TLSの握手、証明書の確認、暗号化された通信が含まれます。 HTTPSを実装する場合、証明書管理、パフォーマンスへの影響、および混合コンテンツの問題に注意を払う必要があります。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境