一、系统架构设计思路
在线客服系统的核心需求包括实时通信、会话管理、用户身份识别和历史记录追溯。基于PHP与Swoole的异步非阻塞特性,CRMchat采用分层架构设计:
-
连接管理层:Swoole WebSocket服务器负责处理长连接,支持万级并发连接管理。通过
onOpen、onMessage、onClose事件回调实现连接生命周期控制。 -
业务逻辑层:PHP实现用户认证、路由分发、消息处理等核心功能。采用MVC模式分离业务逻辑与数据访问,提升代码可维护性。
-
数据存储层:MySQL存储用户信息、会话记录等结构化数据,Redis缓存会话状态、在线客服列表等高频访问数据。
// Swoole服务器基础配置示例$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);$server->set(['worker_num' => 4,'heartbeat_check_interval' => 60,'heartbeat_idle_time' => 600]);
二、环境准备与依赖安装
-
PHP环境要求:
- PHP 7.4+(推荐8.0+)
- 安装Swoole扩展(4.5+版本)
- 启用pcntl、posix扩展(进程管理需要)
-
依赖管理工具:
composer require predis/prediscomposer require monolog/monolog
-
数据库初始化:
CREATE TABLE `users` (`id` INT AUTO_INCREMENT PRIMARY KEY,`username` VARCHAR(50) NOT NULL,`role` ENUM('customer','agent','admin') DEFAULT 'customer');CREATE TABLE `sessions` (`id` VARCHAR(32) PRIMARY KEY,`customer_id` INT NOT NULL,`agent_id` INT,`status` ENUM('pending','active','closed') DEFAULT 'pending');
三、核心功能实现
1. WebSocket通信实现
通过Swoole的WebSocket协议实现双向通信:
$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {$data = json_decode($frame->data, true);switch ($data['type']) {case 'auth':handleAuth($server, $frame->fd, $data);break;case 'message':routeMessage($server, $frame->fd, $data);break;}});
2. 用户认证机制
采用JWT令牌实现无状态认证:
function generateToken($userId) {$payload = ['uid' => $userId,'exp' => time() + 3600];return JWT::encode($payload, 'your-secret-key');}function verifyToken($token) {try {$decoded = JWT::decode($token, 'your-secret-key', ['HS256']);return $decoded->uid;} catch (Exception $e) {return false;}}
3. 会话路由逻辑
实现智能客服分配算法:
function assignAgent($customerId) {$redis = new Predis\Client();$availableAgents = $redis->smembers('available_agents');if (empty($availableAgents)) {return false;}$agentId = array_shift($availableAgents);$redis->srem('available_agents', $agentId);// 创建会话记录$sessionId = bin2hex(random_bytes(16));DB::table('sessions')->insert(['id' => $sessionId,'customer_id' => $customerId,'agent_id' => $agentId,'status' => 'active']);return $sessionId;}
四、性能优化策略
-
连接管理优化:
- 设置合理的
heartbeat_check_interval(建议60秒) - 实现空闲连接自动回收机制
- 使用连接池管理数据库连接
- 设置合理的
-
消息队列集成:
// 使用Redis Stream实现异步消息处理$redis = new Predis\Client();$redis->xadd('message_queue', '*', ['type' => 'customer_message','content' => $message,'session_id' => $sessionId]);
-
缓存策略设计:
- 热点数据缓存(如在线客服列表)
- 会话状态缓存(Redis Hash结构)
- 实施缓存淘汰策略(LRU算法)
五、部署与运维建议
-
进程模型配置:
$server->set(['worker_num' => cpu_count() * 2,'task_worker_num' => 4, // 异步任务处理'enable_coroutine' => true]);
-
监控告警体系:
- 连接数监控(
$server->stats()) - 内存使用监控
- 消息处理延迟监控
- 连接数监控(
-
水平扩展方案:
- 采用一致性哈希实现多节点部署
- 共享Redis存储会话状态
- 实施负载均衡策略
六、完整源码结构说明
/CRMchat├── config/ # 配置文件目录│ ├── database.php # 数据库配置│ └── server.php # Swoole服务器配置├── src/│ ├── Core/ # 核心类库│ ├── Controller/ # 业务控制器│ └── Model/ # 数据模型├── public/ # Web入口文件├── storage/ # 日志与缓存└── composer.json # 依赖管理
七、常见问题解决方案
-
连接断开问题:
- 检查防火墙设置(确保9501端口开放)
- 调整心跳检测参数
- 实现断线重连机制
-
消息丢失处理:
- 实现消息确认机制
- 添加消息重试队列
- 记录消息处理日志
-
高并发场景优化:
- 启用Swoole协程(
enable_coroutine => true) - 实施读写分离
- 使用连接池复用数据库连接
- 启用Swoole协程(
本方案通过PHP与Swoole的深度整合,实现了低延迟、高并发的在线客服系统。实际部署时建议结合企业具体需求调整架构参数,特别是连接数配置和缓存策略。对于超大规模部署场景,可考虑引入消息中间件实现跨节点通信,进一步提升系统可扩展性。