Think-Swoole 3.0 では Websocket に Room チャット ルーム機能が追加されました。これは主にグループ メッセージングに使用されますが、異なる Room 間のメッセージは互いに分離されます。チャット ルームに入ると、このチャット ルームの fd のみが、入力、退出、送信したメッセージを受信できます。
config.swoole.php
'websocket' => [ 'enable' => true, 'handler' => Handler::class, 'parser' => Parser::class, 'ping_interval' => 25000, 'ping_timeout' => 60000, 'room' => [ 'type' => 'table', 'table' => [ 'room_rows' => 4096, 'room_size' => 2048, 'client_rows' => 8192, 'client_size' => 2048, ], 'redis' => [ 'host' => '127.0.0.1', 'port' => 6379, 'max_active' => 3, 'max_wait_time' => 5, ], ], 'listen' => [], 'subscribe' => [], ],
ルーム設定項目があり、その中の種類はどのようなデータ処理方法を使用しているかを示しており、以下の「table」と「redis」の2種類があります。表は直接使用できますが、redis を使用するにはシステムとプロジェクトに redis 拡張機能がインストールされている必要があります。 table は、異なるプロセス間でデータを共有できる、高性能のクロスプロセス メモリ処理サービスです。
イベントの作成
プロジェクト ルート ディレクトリに次のコマンドを入力して、ルーム参加イベント、ルーム退出イベント、ルーム チャット イベントをそれぞれ作成します。 # 次に、app/event.php でイベントを定義します。
php think make:listener WsJoin php think make:listener WsLeave php think make:listener RoomTest
Join、Leave、RoomTest などの上記の名前はすべてカスタマイズされており、フロントエンドによって送信されるメッセージのシーン値に対応する必要があります。
もちろん、config/swoole.php設定ファイルのwebsocket listenでもイベント定義を設定することができますので、詳しくは前回の記事を参照してください。
H5 WebSocker クライアント接続wsroot.html
[ ], 'listen' => [ 'AppInit' => [], 'HttpRun' => [], 'HttpEnd' => [], 'LogLevel' => [], 'LogWrite' => [], //监听连接,swoole 事件必须以 swoole 开头 'swoole.websocket.Connect' => [ app\listener\WsConnect::class ], //监听关闭 'swoole.websocket.Close' => [ \app\listener\WsClose::class ], //监听 Test 场景 'swoole.websocket.Test' => [ \app\listener\WsTest::class ], //加入房间事件 'swoole.websocket.Join' => [ \app\listener\WsJoin::class ], //离开房间事件 'swoole.websocket.Leave' => [ \app\listener\WsLeave::class ], //处理聊天室消息 'swoole.websocket.RoomTest' => [ \app\listener\RoomTest::class ], ], 'subscribe' => [ ], ];SocketIO クライアント接続
ioroomtest.html
<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <button onclick="join()">加入房间</button> <button onclick="leave()">离开房间</button> <input type="text" id="message"> <button onclick="send()">发送</button> <script> var ws = new WebSocket("ws://127.0.0.1:9501/?uid=1"); ws.onopen = function(){ console.log('连接成功'); } //数据返回的解析 function mycallback(data){ var start = data.indexOf('[') // 第一次出现的位置 var start1 = data.indexOf('{') if(start < 0){ start = start1; } if(start >= 0 && start1 >= 0){ start = Math.min(start,start1); } if(start >= 0){ console.log(data); var json = data.substr(start); //截取 var json = JSON.parse(json); console.log(json); // if(json instanceof Array){ // window[json[0]](json[1]); // } } } function sendfd($message){ console.log($message) } function testcallback($message){ console.log($message) } function joincallback($message){ // console.log($message) console.log(11); } function leavecallback($message){ console.log($message) } ws.onmessage = function(data){ // console.log(data.data); mycallback(data.data); } ws.onclose = function(){ console.log('连接断开'); } function join() { var room = prompt('请输入房间号'); ws.send(JSON.stringify(['join',{ room:room }])); //发送的数据必须是 ['test',数据] 这种格式 } function leave() { var room = prompt('请输入要离开的房间号'); ws.send(JSON.stringify(['leave',{ room:room }])); //发送的数据必须是 ['test',数据] 这种格式 } function send() { var message = document.getElementById('message').value; var room = prompt('请输入接收消息的房间号') ws.send(JSON.stringify(['RoomTest',{ message:message, room:room }])); //发送的数据必须是 ['test',数据] 这种格式 } </script> </body> </html>
このページでは、join()、leave()、send() 関数で定義されているシーンの値は、それぞれ join、leave、RoomTest であり、app/leave.php で定義しています。これらのシーン値はイベントに対応するため、それぞれ WsJoin.php、WsLeave.php、RoomTest.php イベントをトリガーします。
バックエンド イベントの書き込みapp/listener/WsJoin.php
<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <button onclick="join()">加入房间</button> <button onclick="leave()">离开房间</button> <input type="text" id="message"> <button onclick="send()">发送</button> <script src="./socketio.js"></script> <script> //http 协议 var socket = io("http://127.0.0.1:9501?uid=1", {transports: ['websocket']}); socket.on('connect', function(){ console.log('connect success'); }); socket.on('close',function(){ console.log('connect close') }); //send_fd 为自定义的场景值,和后端对应 socket.on("sendfd", function (data) { console.log(data) }); //testcallback 为自定义的场景值,和后端对应 socket.on("testcallback", function (data) { console.log(data) }); socket.on("joincallback", function (data) { console.log(data) }); socket.on("roomtestcallback", function (data) { console.log(data) }); function join() { var room = prompt('请输入房间号'); socket.emit('join',{ room : room }); } function leave() { var room = prompt('请输入要离开的房间号'); socket.emit('leave',{ room : room }); } function send() { var message = document.getElementById('message').value; var room = prompt('请输入接收消息的房间号') socket.emit('RoomTest',{ message : message, room : room }); } </script> </body> </html>
app/listener/WsLeave.php
<?php declare (strict_types = 1); namespace app\listener; class WsJoin { /** * 事件监听处理 * * @return mixed */ public function handle($event) { $ws = app('think\swoole\Websocket'); $roomobj = app('think\swoole\websocket\Room'); //当前客户端加入指定 Room $ws -> join($event['room']); //同时加入多个房间 // $ws -> join(['room1','room2']); //指定客户端加入指定 room // $ws -> setSender(2) -> join($event['room']); //获取当前房间所有的 fd $getAllFdInRoom = $roomobj -> getClients($event['room']); //获取指定 fd 加入哪些房间 $getAllRoom = $roomobj -> getRooms($ws -> getSender()); var_dump('当前房间所有 fd:',$getAllFdInRoom); var_dump('当前 fd 加入的所有房间:',$getAllRoom); var_dump('当前请求数据:',$event); $ws -> emit('joincallback','房间加入成功'); } }
app /listener/RoomTest.php
<?php declare (strict_types = 1); namespace app\listener; class WsLeave { /** * 事件监听处理 * * @return mixed */ public function handle($event) { $ws = app('think\swoole\Websocket'); $roomobj = app('think\swoole\websocket\Room'); // 当前客户端离开指定 room $ws -> leave($event['room']); // 同时离开多个 room // $ws -> leave(['one','two']); // 指定客户端离开指定 room // $ws -> setSender(2) -> leave($event['room']); // 获取指定 room 中的所有客户端 fd $getAllFdInRoom = $roomobj -> getClients($event['room']); var_dump('当前房间还剩 fd:',$getAllFdInRoom); $ws -> emit('leavecallback','房间离开成功'); } }
上記は、フロントエンド HTML ページとバックエンドのルームへの参加、ルームからの退出、ルーム チャットのイベント コードです。テストを開始しましょう。
まず、プロジェクトのルート ディレクトリで Think-Swoole サービスを有効にします。
ブラウザが wsroot.html または ioroomtest.html ページにアクセスすると、複数のタブを開いて複数のクライアントをシミュレートできます。最初に 3 つ開きます。接続が成功すると、FD は 1、2、および 3 になります。 fd 1 と 2 の両方を持つクライアントを「1 つの」ルームに参加させ、fd 3 を持つクライアントを「2 つの」ルームに参加させます。ユーザーがルームに参加しているすべての fd を WsJoin.php に出力するためです。ルーム参加イベント、および参加したすべてのルームのユーザーの fd 名。この情報はコマンド ラインに出力され、最後にチャット シーンの値と「ルームに正常に参加しました」メッセージが現在のクライアントに送信され、表示できます。ブラウザコンソールで。
ルーム参加後、クライアントでfdを1にして送信するメッセージをページの入力ボックスに入力し、送信をクリック後、送信するルーム名を「one」と入力してください。 、その後、メッセージは「1 つの」ルームに送信され、「1 つの」ルーム (fd は 1 と 2) 内のすべてのクライアントのみがメッセージを受信できます。
ここで、fd 2 を持つクライアントが「one」ルームから退出できるようにします。WsLeave.php の退室イベントでは、退出後に残りの fd を出力するため、コマンド ラインに情報が表示されます。 「部屋には fd 1 しか残っていない。fd 1 は情報を送信するが、fd 2 は受信できない。
WebSocket-Room の他の機能については、上記のコードでコメント化されているため、テストのために開く必要があります。
H5 WebSocket と SocketIO は、前の記事でメッセージの処理をすでに示しています。前者は使用する前にサーバーから返されたメッセージを手動で解析する必要がありますが、後者はシーン値に基づいてメッセージを受信します処理は直接使用できます。
以上がThink-Swoole の WebSocket-Room がルームに参加、退出し、ルーム メッセージを送信しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

TP6Think-SwooleRPC服务的性能优化与调试一、引言随着互联网的迅猛发展,分布式计算已经成为了现代软件开发中不可或缺的一部分。在分布式计算中,RPC(RemoteProcedureCall,远程过程调用)是一种常用的通信机制,通过它可以实现跨网络的方法调用。Think-Swoole作为一个高性能的PHP框架,可以很好地支持RPC服务。但是

TP6Think-SwooleRPC服务的数据加密与身份认证机制随着互联网的快速发展,越来越多的应用程序需要进行远程调用,以实现不同模块之间的数据交互和功能调用。在这样的背景下,RPC(RemoteProcedureCall)就成了一种重要的通信方式。TP6Think-Swoole框架可以实现高性能的RPC服务,本文将介绍如何通过数据加密与身份认证

TP6Think-SwooleRPC服务的高并发请求处理与调度随着互联网技术的不断发展,网络应用的并发请求处理和调度成为了一个重要的挑战。在TP6框架中,使用Think-Swoole扩展可以实现RPC(RemoteProcedureCall)服务的高并发请求处理与调度。本文将介绍如何在TP6框架中搭建一个基于Think-Swoole的RPC服务,并提

TP6(ThinkPHP6)是一款基于PHP的开源框架,具有高可扩展性与分布式部署的特点。本文将介绍如何使用TP6配合Swoole扩展,搭建一个具备高可扩展性的RPC服务,并给出具体的代码示例。首先,我们需要安装TP6和Swoole扩展。在命令行中执行以下命令:composerrequiretopthink/thinkpeclinstallswo

TP6Think-SwooleRPC服务的安全防护与授权验证随着云计算和微服务的兴起,远程过程调用(RPC)成为了开发者们日常工作中必不可少的一部分。在开发RPC服务时,安全防护和授权验证是非常重要的,以确保只有合法的请求可以访问和调用服务。本文将介绍如何在TP6Think-Swoole框架中实现RPC服务的安全防护和授权验证。一、RPC服务的基本概念

TP6Think-SwooleRPC服务的性能测试与性能调优一、引言随着互联网的高速发展,分布式系统的应用越来越广泛。而在分布式系统中,RPC(远程过程调用)是一种常见的通信机制,它可以让不同节点的服务相互调用,实现分布式系统的协同工作。在TP6框架中,Think-Swoole作为一种高性能的Swoole驱动,提供了方便的RPC服务支持。本文主要介绍了T

TP6Think-Swoole的RPC服务与消息队列的集成与应用在现代软件开发中,RPC服务(RemoteProcedureCall)和消息队列是常见的技术手段,用于实现分布式系统中的服务调用和异步消息处理。在TP6框架中集成Think-Swoole组件,可以轻松实现RPC服务和消息队列的功能,并且提供了简洁的代码示例,方便开发者理解和应用。一、RPC

TP6Think-Swoole构建的RPC服务与微服务架构实践案例引言:随着互联网的快速发展以及业务规模的扩大,传统的单体架构已经无法满足大规模业务场景的需求。因此,微服务架构应运而生。在微服务架构中,RPC(RemoteProcedureCall)服务是实现服务间通信的一种重要方式。通过RPC服务,各个微服务之间可以方便、高效地互相调用。在本篇文章中


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

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

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境
