ThinkPHP6 を使用した Websocket ブロードキャストの実装

WBOY
リリース: 2023-06-20 08:41:34
オリジナル
1673 人が閲覧しました

最新の Web アプリケーションの継続的な開発により、リアルタイム通信は必要な機能の 1 つになりました。 WebSocket テクノロジは、最も一般的なリアルタイム通信方法の 1 つであり、サーバーとクライアントの間に永続的な双方向接続を確立してリアルタイム通信を実現できます。

ThinkPHP は非常に人気のある PHP フレームワークであり、ThinkPHP 6 には Swoole 拡張パッケージが付属しているため、WebSocket テクノロジの使用が非常に簡単になります。この記事では、ThinkPHP 6 フレームワークを使用して WebSocket ブロードキャスト機能を実装する方法を紹介します。

環境要件

開始する前に、次の環境を準備する必要があります:

  • PHP 7.2
  • Swoole 拡張機能
  • Composer
  • 基本的な Web 開発の知識

プロジェクトの作成

まず、新しいプロジェクトを作成する必要があります:

composer create-project topthink/think my-project
ログイン後にコピー

次に、 WebSocket を使用すると便利なので、プロジェクトの composer.json ファイルに Swoole 拡張機能を追加する必要があります:

"require": {
    "topthink/think-swoole": "^2.0",
    "swoole/swoole": "^4.7"
}
ログイン後にコピー

完了後、次のコマンドを実行してインストールします:

composer install
ログイン後にコピー

コントローラーの作成

次に、WebSocket リクエストを処理するコントローラーを作成する必要があります。 app/controller ディレクトリに Websocket.php という名前のファイルを作成し、次のコードを記述します。

<?php

declare(strict_types=1);

namespace appcontroller;

use thinkswooleWebsocket as SwooleWebsocket;
use SwooleWebSocketFrame;

class Websocket extends SwooleWebsocket
{
    /**
     * 监听连接事件
     * @param SwooleWebSocketServer $server
     * @param SwooleHttpRequest $request
     */
    public function onOpen($server, $request)
    {
    }

    /**
     * 监听接收消息事件
     * @param SwooleWebSocketServer $server
     * @param Frame $frame
     */
    public function onMessage($server, Frame $frame)
    {
    }

    /**
     * 监听关闭事件
     * @param SwooleWebSocketServer $server
     * @param int $fd
     */
    public function onClose($server, $fd)
    {
    }
}
ログイン後にコピー

上記のコードでは、 ##thinkswooleWebsocket# を継承しました。 ## クラスを作成し、その 3 つのメソッドをオーバーライドします:

    onOpen
  • メソッドは接続イベントをリッスンするために使用されます;
  • onMessage
  • メソッドはメッセージ イベントの受信をリッスンするために使用され、
  • onClose
  • メソッドはクローズ イベントをリッスンするために使用されます。
  • 現状ではこれらのメソッドは何もしていませんが、次にこれらのメソッドにWebSocket通信のロジックを追加していきます。

ルーティングの登録

コントローラーを作成したら、それをルーティングに登録する必要があります。

app/route.php

ファイルに次の内容を追加します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>use think acadeRoute; Route::post('/ws', 'Websocket@onMessage')-&gt;middleware( hinkmiddlewareAllowCrossDomain::class);</pre><div class="contentsignin">ログイン後にコピー</div></div> ここでは、ルートを登録するために

Route::post

メソッドが使用されます。このルートのリクエスト メソッドは POST、パスは /ws、リクエストは Websocket## の onMessage メソッドにマップされます。 #コントローラー。 WebSocket 通信ロジックの作成

これで、WebSocket ルートとコントローラーの作成と登録が完了しました。次に、コントローラーに WebSocket 通信のロジックを追加する必要があります。 WebSocket通信を実装するにはSwooleのWebSocketサーバーを利用します。

onOpen

メソッドでは、クライアントの接続オブジェクトを取得し、後で使用するために保存できます。

onMessage メソッドでは、クライアントから送信されたメッセージを取得し、このメッセージを他のクライアントにブロードキャストできます。 onClose メソッドでは、接続プールからクライアントを削除する必要があります。 app/controller

ディレクトリに

WebSocketServer.php という名前のファイルを作成し、次のコードを記述します:

<?php

declare(strict_types=1);

namespace appcontroller;

use SwooleHttpResponse;
use SwooleWebSocketFrame;
use SwooleWebSocketServer;
use thinkswoolewebsocketHandlerInterface;

class WebSocketServer implements HandlerInterface
{
    /**
     * @var array $connections
     */
    private $connections = [];

    /**
     * 监听连接事件
     * @param Server $server
     * @param SwooleHttpRequest $request
     */
    public function onOpen(Server $server, SwooleHttpRequest $request): void
    {
        $this->connections[$request->fd] = $request->fd;

        echo "client-{$request->fd} is connected
";
    }

    /**
     * 监听消息事件
     * @param Server $server
     * @param Frame $frame
     */
    public function onMessage(Server $server, Frame $frame): void
    {
        foreach ($this->connections as $fd) {
            $info = $server->getClientInfo((int)$fd);
            if ($info && isset($info['websocket_status']) && $info['websocket_status'] == WEBSOCKET_STATUS_FRAME) {
                $server->push($fd, $frame->data);
            } else {
                unset($this->connections[$fd]);
            }
        }

        echo "received message from client-{$frame->fd}: {$frame->data}
";
    }

    /**
     * 监听关闭事件
     * @param Server $server
     * @param int $fd
     * @param int $reactorId
     */
    public function onClose(Server $server, int $fd, int $reactorId): void
    {
        unset($this->connections[$fd]);

        echo "client-{$fd} is closed
";
    }

    /**
     * @param Response $response
     */
    public function onHandShake(Request $request, Response $response): bool
    {
        // Do nothing
        return true;
    }
}
ログイン後にコピー
WebSocket サービスの構成

WebSocket サービス コードを記述する前に、

config

ディレクトリに

swoole.php という名前の構成ファイルを作成し、次の内容を記述する必要があります。

return [
    'socket_type' => 'websocket',
    'host'        => '0.0.0.0',
    'port'        => 9501,
    'mode'        => SWOOLE_PROCESS,
    'sock_type'   => SWOOLE_SOCK_TCP,
    'settings' => [
        'worker_num' => swoole_cpu_num(),
    ],
    'handler' => ppcontrollerWebSocketServer::class,
];
ログイン後にコピー
上記のコードでは、構成ファイルを通じて Swoole WebSocket サービスを開始する方法をアプリケーションに伝えます。 websocket

ソケット タイプを開始し、

0.0.0.0:9501 にバインドし、TCP プロトコルを使用してマルチプロセス モードを有効にします。 worker_num 構成項目は、サーバーのプロセス数を設定します。swoole_cpu_num() は、システム CPU の数を返すためにここで使用されます。handler 構成項目は、次の内容を指定します。 WebSocketServer クラスを作成しました。 WebSocket サービスの実行

WebSocket サービスを作成および構成するコードが完了したら、コードを実行して WebSocket サービスを開始する必要があります。コマンド ラインで次のコマンドを実行するだけです:

php think swoole start --mode=websocket
ログイン後にコピー
Websocket サービスが開始されたので、アプリケーションにアクセスしてテストできます。次のアドレスを使用できます:

ws://your-domain:9501/ws

。ブラウザで複数のタブを開いて、WebSocket 接続、メッセージ送信機能、受信機能をそれぞれテストします。

概要

この記事では、ThinkPHP 6 フレームワークを使用して WebSocket ブロードキャスト機能を実装する方法を紹介します。これを実現するには、コントローラーを作成し、ルートを登録し、WebSocket 通信ロジックを作成し、WebSocket サービスを構成します。この例は、単純な WebSocket のベスト プラクティスとして使用でき、より高度な WebSocket 関数を開発するためのリファレンスとなります。

以上がThinkPHP6 を使用した Websocket ブロードキャストの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート