ThinkPHP6+WebSocket实现实时在线聊天系统全攻略

2025-07-19 0 298

 

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存储未读消息
ThinkPHP6+WebSocket实现实时在线聊天系统全攻略
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

淘吗网 thinkphp ThinkPHP6+WebSocket实现实时在线聊天系统全攻略 https://www.taomawang.com/server/thinkphp/476.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务