1. Workerman在线客服系统架构解析
Workerman作为一款高性能的PHP Socket框架,其在线客服系统的核心在于长连接通信能力。与传统基于HTTP轮询的客服系统相比,这套方案采用WebSocket协议实现全双工通信,消息延迟可控制在100ms以内。系统架构上分为三层:
- 接入层:处理PC网页、H5、微信小程序的多端协议适配
- 业务层:实现会话分配、消息路由、历史记录等核心功能
- 数据层:采用MySQL+Redis组合,Redis负责在线状态和实时消息,MySQL持久化存储
2. 多端适配关键技术实现
2.1 PC网页端实现方案
PC端采用Workerman+WebSocket原生方案,前端使用SockJS作为兼容层。关键配置点:
php复制// Workerman WebSocket服务配置
$worker = new Worker('websocket://0.0.0.0:2345');
$worker->count = 4; // 根据CPU核心数设置
$worker->onMessage = function($connection, $data) {
// 消息处理逻辑
};
2.2 H5移动端适配技巧
H5端需特别注意移动网络环境下的连接稳定性:
- 心跳检测间隔设置为25秒(避免运营商NAT超时)
- 断线自动重连机制(指数退避算法)
- 消息队列本地缓存(支持离线消息)
2.3 微信小程序特殊处理
微信小程序需使用其原生WebSocket API,特别注意:
javascript复制// 小程序端连接示例
const socket = wx.connectSocket({
url: 'wss://yourdomain.com/wss',
success: () => {
console.log('连接成功')
}
})
必须配置合法HTTPS域名,且在微信后台加入业务域名白名单。
3. 服务端部署实战指南
3.1 基础环境准备
推荐使用CentOS 7+系统,必备组件:
- PHP 7.4+(需安装pcntl、posix扩展)
- MySQL 5.7+
- Redis 5.0+
- Nginx(用于前端资源代理)
3.2 Workerman服务配置
核心配置文件start.php示例:
php复制require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
// 避免PHP报错导致进程退出
Worker::$daemonize = true;
Worker::$stdoutFile = '/tmp/workerman.log';
$ws_worker = new Worker('websocket://0.0.0.0:2346');
$ws_worker->transport = 'ssl'; // 启用SSL加密
$ws_worker->count = 8;
// 业务逻辑初始化...
3.3 高可用部署方案
生产环境建议采用:
- Supervisor进程守护
- Nginx负载均衡(多个Workerman实例)
- Redis集群(消息广播)
4. 典型问题排查与优化
4.1 连接稳定性问题
常见现象:移动端频繁断线
解决方案:
- 调整心跳间隔(25-30秒)
- 开启TCP keepalive
php复制$worker->onWorkerStart = function($worker) {
// 每10秒发送心跳
Timer::add(10, function() use ($worker) {
foreach($worker->connections as $conn) {
$conn->send('ping');
}
});
};
4.2 性能瓶颈分析
当并发超过5000时可能出现:
- 增加Workerman进程数(不超过CPU核心数2倍)
- 启用OPcache加速PHP
- 消息广播改用Redis发布订阅模式
4.3 微信小程序审核要点
- 隐私协议必须明确说明Socket连接用途
- 客服消息内容需过滤敏感词
- 用户头像显示需配置downloadFile合法域名
5. 高级功能扩展实践
5.1 客服智能路由
基于Redis实现技能组路由:
php复制// 根据客户问题类型分配客服
$redis = new Redis();
$skill = $redis->zRangeByScore('customer_skills', $questionLevel, '+inf', ['limit' => [0, 1]]);
if ($skill) {
$target = $redis->hGet('online_agents', $skill[0]);
$worker->connections[$target]->send($message);
}
5.2 历史消息同步
采用MySQL分表存储+Redis缓存最近会话方案:
- 按用户ID哈希分表(message_0到message_15)
- Redis缓存最近50条消息(sorted set存储)
5.3 文件传输方案
- 小文件(<5MB):Base64直接传输
- 大文件:先传七牛云/阿里云OSS,再传URL
- 微信小程序需使用uploadFile API
实际部署中发现,当Workerman与Nginx同机部署时,需要调整内核参数:
bash复制# 增加本地端口范围
echo 'net.ipv4.ip_local_port_range = 1024 65000' >> /etc/sysctl.conf
# 提高最大文件描述符
ulimit -n 65535
sysctl -p
对于客服会话状态的保持,我们采用Redis的过期键机制:用户连接时设置online:userid键,设置300秒过期时间,通过心跳定期续期。这种方案相比MySQL轮询可降低90%的数据库压力。
