ThinkPHP6+WebSocket实现实时在线聊天系统全攻略
一、技术选型与架构设计
实时通信系统核心组件:
- ThinkPHP6:业务逻辑处理
- Workerman:WebSocket服务端
- GatewayWorker:分布式通信框架
- Redis:在线状态维护
二、核心代码实现
1. WebSocket服务端
// websocket.php use GatewayWorkerBusinessWorker; use GatewayWorkerGateway; use GatewayWorkerRegister; $context = [ 'ssl' => [ 'local_cert' => '/path/to/ssl.pem', 'local_pk' => '/path/to/ssl.key', 'verify_peer' => false ] ]; // 初始化Register $register = new Register('text://0.0.0.0:1236'); // 初始化BusinessWorker $worker = new BusinessWorker(); $worker->name = 'ChatBusinessWorker'; $worker->count = 4; $worker->registerAddress = '127.0.0.1:1236'; // 初始化Gateway $gateway = new Gateway("websocket://0.0.0.0:8282", $context); $gateway->transport = 'ssl'; $gateway->name = 'ChatGateway'; $gateway->count = 4; $gateway->lanIp = '127.0.0.1'; $gateway->startPort = 2300; $gateway->registerAddress = '127.0.0.1:1236';
2. 消息处理事件
// Events.php class Events { public static function onMessage($client_id, $message) { $message = json_decode($message, true); switch ($message['type']) { case 'login': // 绑定用户ID与连接关系 Gateway::bindUid($client_id, $message['user_id']); break; case 'chat': // 私聊消息转发 Gateway::sendToUid($message['to'], [ 'from' => $message['from'], 'content' => htmlspecialchars($message['content']) ]); break; } } }
3. ThinkPHP控制器集成
// ChatController.php class ChatController extends Controller { public function getOnlineUsers() { // 从Redis获取在线用户 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $onlineUsers = $redis->hGetAll('online_users'); return json($onlineUsers); } public function sendSystemMsg() { $content = input('post.content'); // 推送给所有用户 Gateway::sendToAll(json_encode([ 'type' => 'system', 'content' => $content, 'time' => date('Y-m-d H:i:s') ])); return json(['status' => 'success']); } }
三、前端关键实现
// chat.js const ws = new WebSocket('wss://yourdomain.com:8282'); // 登录认证 ws.onopen = () => { ws.send(JSON.stringify({ type: 'login', user_id: currentUserId })); }; // 消息接收处理 ws.onmessage = (e) => { const msg = JSON.parse(e.data); switch(msg.type) { case 'chat': appendMessage(msg.from, msg.content); break; case 'system': showSystemNotice(msg.content); break; } }; // 发送私聊消息 function sendPrivateMsg(to, content) { ws.send(JSON.stringify({ type: 'chat', from: currentUserId, to: to, content: content })); }
四、性能优化方案
- 连接保活:心跳机制保持长连接
- 消息压缩:对大型消息进行gzip压缩
- 负载均衡:多服务器部署方案
- 离线消息:Redis存储未读消息