一、系统架构与技术选型
1.1 架构设计思路
本系统采用”前端+网关+业务处理”的三层架构设计:
- 前端层:基于WebSocket的实时通信接口,兼容主流浏览器及移动端
- 网关层:Workerman作为高性能Socket服务器,处理并发连接与消息路由
- 业务层:ThinkPHP提供RESTful API服务,处理用户认证、会话管理、消息存储等业务逻辑
这种架构的优势在于:
- Workerman的纯PHP实现避免了语言切换开销
- ThinkPHP的MVC模式加速业务开发
- 水平扩展能力强,可通过增加Worker进程应对高并发
1.2 核心组件选型
- 通信框架:Workerman 4.0+(支持WebSocket/TCP/UDP)
- 业务框架:ThinkPHP 6.x(基于PHP 8.1+)
- 数据库:MySQL 8.0(主从架构)
- 缓存:Redis 6.0(会话存储与消息队列)
- 前端:Vue3 + Element Plus(管理后台)
二、源码核心功能实现
2.1 Workerman服务端实现
// worker.php 基础配置示例require_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;$ws_worker = new Worker("websocket://0.0.0.0:2346");$ws_worker->count = 4; // 启动4个进程$ws_worker->name = 'ChatWorker';$ws_worker->onWorkerStart = function($worker) {echo "Worker starting... PID:" . posix_getpid() . "\n";};$ws_worker->onMessage = function($connection, $data) {// 消息处理逻辑$response = ['type' => 'message','data' => json_decode($data, true),'time' => date('Y-m-d H:i:s')];$connection->send(json_encode($response));};Worker::runAll();
关键实现点:
- 进程管理:通过
count参数控制并发进程数 - 心跳机制:内置
onWorkerStop实现优雅退出 - 协议扩展:支持自定义二进制协议解析
2.2 ThinkPHP业务层实现
// app/controller/Chat.php 示例namespace app\controller;use think\Request;use think\facade\Db;class Chat{public function sendMessage(Request $request){$data = $request->post();// 参数校验validate(['content' => 'require|min:5'])->check($data);// 存储消息$result = Db::name('chat_messages')->insert(['user_id' => $data['user_id'],'content' => $data['content'],'created_at' => time()]);return json(['code' => 200, 'data' => $result]);}}
业务层核心功能:
- 用户认证:JWT令牌管理
- 会话管理:基于Redis的在线状态追踪
- 消息存储:分表策略应对海量数据
- 智能路由:根据业务规则分配客服
三、完整搭建教程
3.1 环境准备
-
服务器要求:
- Linux(CentOS 7+/Ubuntu 20.04+)
- PHP 8.1+(需安装pcntl、posix扩展)
- Nginx 1.18+(反向代理配置)
- Supervisor进程管理
-
依赖安装:
```bash安装Composer依赖
composer install
安装Workerman扩展
pecl install channel://pecl.php.net/workerman-0.1.0
## 3.2 部署步骤1. **代码部署**:- 将源码上传至`/var/www/chat_system`- 设置目录权限:```bashchown -R www-data:www-data /var/www/chat_systemchmod -R 755 /var/www/chat_system/storage
-
配置文件调整:
- 修改
.env文件中的数据库配置 - 设置JWT密钥:
APP_SECRET=your_random_string
- 修改
-
Nginx配置示例:
server {listen 80;server_name chat.example.com;location / {proxy_pass http://127.0.0.1:8000;proxy_set_header Host $host;}location /ws {proxy_pass http://127.0.0.1:2346;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}}
-
Supervisor配置:
[program:chat_worker]command=php /var/www/chat_system/worker.php startdirectory=/var/www/chat_systemuser=www-dataautostart=trueautorestart=truestderr_logfile=/var/log/chat_worker.err.logstdout_logfile=/var/log/chat_worker.out.log
3.3 性能优化建议
-
连接管理优化:
- 设置合理的
maxConnections参数(建议5000-10000) - 启用
reusePort提升多核利用率
- 设置合理的
-
数据库优化:
- 消息表按日期分表(如
chat_202310) - 配置读写分离
- 消息表按日期分表(如
-
缓存策略:
- 使用Redis集群存储在线用户列表
- 实现多级缓存(本地缓存+分布式缓存)
-
监控体系:
- 集成Prometheus监控Worker状态
- 设置Grafana看板监控QPS、响应时间等指标
四、扩展功能实现
4.1 智能路由算法
// 客服分配策略示例class Router{public static function assignAgent($userId){// 获取用户标签$userTags = Db::name('user_tags')->where('user_id', $userId)->select();// 匹配最佳客服$bestAgent = Db::name('agents')->where('status', 1)->whereExists(function($query) use ($userTags) {$query->select(1)->from('agent_skills')->whereColumn('agent_id', 'agents.id')->whereIn('skill_id', array_column($userTags, 'tag_id'));})->orderBy('load', 'asc')->find();return $bestAgent ?? self::fallbackAgent();}}
4.2 消息持久化方案
采用”实时写入+异步归档”策略:
- 消息首先写入Redis Stream
- Consumer组消费消息并批量插入MySQL
- 定期清理Redis中的已归档数据
五、常见问题解决方案
-
连接断开问题:
- 检查防火墙设置(确保2346端口开放)
- 调整
heartbeatCheckInterval参数(建议30-60秒)
-
高并发下消息丢失:
- 启用Workerman的
transport参数为tcp - 实现消息确认机制
- 启用Workerman的
-
ThinkPHP路由冲突:
- 在
route/app.php中明确优先级:Route::group('chat', function() {Route::post('send', 'Chat/sendMessage');})->prefix('app\controller\');
- 在
本系统源码包已包含完整实现代码、数据库脚本及详细文档,开发者可通过修改配置文件快速适配不同业务场景。建议部署时采用容器化方案(如Docker Swarm)实现弹性伸缩,应对业务高峰期的流量冲击。