必须用gatewayworker的joingroup和sendtogroup实现群组通信,前端获取client_id后通过bind.php绑定uid并加入分组,再调用sendtogroup向指定群组广播消息。

要在Web端实现多人实时群聊,必须让不同用户的WebSocket连接归属于同一逻辑分组,并在发送消息时精准广播给该组所有在线成员。Workerman本身不内置群组管理,需依赖GatewayWorker的joinGroup和sendToGroup机制完成分组通信。
搭建GatewayWorker基础服务
下载GatewayWorker包,解压到项目根目录下的Applications文件夹中,确保路径为Applications/GatewayWorker/。
修改Applications/GatewayWorker/Events.php,将onConnect方法替换为以下内容:
public static function onConnect($event) → { GatewayClient::joinGroup($event['client_id'], 'default_room'); }
这一步必须做,否则后续调用sendToGroup会静默失败——【未调用joinGroup的client_id无法被sendToGroup识别】。
前端建立WebSocket并绑定用户身份
页面加载后,用JavaScript发起WebSocket连接:
const ws = new WebSocket('ws://your-domain.com:7272');
连接成功后,立即监听message事件,等待服务端下发client_id:
ws.onmessage = (e) => { const data = JSON.parse(e.data); if (data.type === 'init') { sendBindRequest(data.client_id); } };
收到client_id后,立刻用AJAX向后端/bind.php提交绑定请求,携带当前登录用户的uid(如session中的用户ID)。
后端完成client_id与uid绑定及分组加入
创建bind.php,内容如下:
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
① 引入GatewayClient:require_once __DIR__.'/vendor/autoload.php';
② 获取POST参数:$client_id = $_POST['client_id'] ?? ''; $uid = $_SESSION['uid'] ?? 0;
③ 执行绑定与分组操作:
use GatewayClient\Gateway;Gateway::bindUid($client_id, $uid);Gateway::joinGroup($client_id, 'tech_team');
注意:同一个client_id可同时加入多个分组,但bindUid只能调用一次,重复调用会覆盖原绑定关系。
向指定群组发送消息
方法一:直接调用GatewayClient发送文本消息
Gateway::sendToGroup('tech_team', json_encode(['type'=>'msg','from'=>$uid,'content'=>$text]));
方法二:通过HTTP接口触发推送(推荐用于业务解耦)
在ThinkPHP控制器中接收消息POST请求 → 校验权限 → 调用sendToGroup → 返回成功状态。
这一步操作起来很简单,直接把格式化后的JSON字符串传进去就行,但必须确保目标分组名与joinGroup时使用的完全一致,大小写敏感、空格不可多一个。










