最新の Web アプリケーションの継続的な開発により、リアルタイム通信は必要な機能の 1 つになりました。 WebSocket テクノロジは、最も一般的なリアルタイム通信方法の 1 つであり、サーバーとクライアントの間に永続的な双方向接続を確立してリアルタイム通信を実現できます。
ThinkPHP は非常に人気のある PHP フレームワークであり、ThinkPHP 6 には Swoole 拡張パッケージが付属しているため、WebSocket テクノロジの使用が非常に簡単になります。この記事では、ThinkPHP 6 フレームワークを使用して WebSocket ブロードキャスト機能を実装する方法を紹介します。
開始する前に、次の環境を準備する必要があります:
まず、新しいプロジェクトを作成する必要があります:
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 つのメソッドをオーバーライドします:
ルーティングの登録
ファイルに次の内容を追加します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>use thinkacadeRoute;
Route::post('/ws', 'Websocket@onMessage')->middleware( hinkmiddlewareAllowCrossDomain::class);</pre><div class="contentsignin">ログイン後にコピー</div></div>
ここでは、ルートを登録するために
メソッドが使用されます。このルートのリクエスト メソッドは POST
、パスは /ws
、リクエストは Websocket## の
onMessage メソッドにマップされます。 #コントローラー。
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 サービス コードを記述する前に、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 サービスの実行
php think swoole start --mode=websocket
ws://your-domain:9501/ws
。ブラウザで複数のタブを開いて、WebSocket 接続、メッセージ送信機能、受信機能をそれぞれテストします。概要
以上がThinkPHP6 を使用した Websocket ブロードキャストの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。