免费资源下载
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存储未读消息

