一、系统架构设计
在线客服系统的核心架构需满足实时通信、高并发处理和低延迟响应三大需求。推荐采用分层架构设计:
- 表现层:前端页面(HTML/CSS/JavaScript)负责用户交互,WebSocket实现实时消息推送
- 业务逻辑层:PHP处理用户认证、消息路由、会话管理等核心功能
- 数据访问层:MySQL存储用户信息、聊天记录等结构化数据
- 缓存层:Redis缓存在线客服状态、未读消息数等高频访问数据
典型部署方案建议使用Nginx+PHP-FPM组合,通过负载均衡器分发请求。对于中小规模系统,单台4核8G服务器即可支撑初期1000并发用户,后期可通过横向扩展实现线性扩容。
二、数据库设计
核心数据表设计需包含以下关键表:
-- 用户表CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password_hash VARCHAR(255) NOT NULL,role ENUM('customer', 'agent', 'admin') DEFAULT 'customer',last_active TIMESTAMP);-- 会话表CREATE TABLE conversations (id INT AUTO_INCREMENT PRIMARY KEY,customer_id INT NOT NULL,agent_id INT,status ENUM('pending', 'active', 'closed') DEFAULT 'pending',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (customer_id) REFERENCES users(id));-- 消息表CREATE TABLE messages (id INT AUTO_INCREMENT PRIMARY KEY,conversation_id INT NOT NULL,sender_id INT NOT NULL,content TEXT NOT NULL,sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,is_read BOOLEAN DEFAULT FALSE,FOREIGN KEY (conversation_id) REFERENCES conversations(id),FOREIGN KEY (sender_id) REFERENCES users(id));
索引优化策略:在conversations(customer_id)、messages(conversation_id)等查询高频字段建立索引,可提升30%以上的查询效率。对于历史消息归档,建议按月分表存储。
三、核心功能实现
1. 实时通信实现
采用WebSocket协议实现双向通信,PHP可通过Ratchet库快速搭建WebSocket服务:
// composer require cboden/ratchetuse Ratchet\MessageComponentInterface;use Ratchet\ConnectionInterface;class Chat implements MessageComponentInterface {protected $clients;public function __construct() {$this->clients = new \SplObjectStorage;}public function onOpen(ConnectionInterface $conn) {$this->clients->attach($conn);}public function onMessage(ConnectionInterface $from, $msg) {foreach ($this->clients as $client) {if ($from !== $client) {$client->send($msg);}}}}// 启动服务$app = new Ratchet\App('localhost', 8080);$app->route('/chat', new Chat);$app->run();
2. 会话管理逻辑
会话分配算法建议采用”最少忙碌客服”策略:
function assignAgent($customerId) {$pendingConvs = getPendingConversations($customerId);if (!empty($pendingConvs)) {return $pendingConvs[0]['agent_id'];}$availableAgents = getAvailableAgents();if (empty($availableAgents)) {return null; // 无可用客服}// 选择当前会话数最少的客服$minLoadAgent = null;$minLoad = PHP_INT_MAX;foreach ($availableAgents as $agent) {$load = countActiveConversations($agent['id']);if ($load < $minLoad) {$minLoad = $load;$minLoadAgent = $agent;}}return $minLoadAgent['id'];}
3. 消息持久化
采用事务处理确保消息可靠性:
function saveMessage($conversationId, $senderId, $content) {$db = getDatabaseConnection();try {$db->beginTransaction();$stmt = $db->prepare("INSERT INTO messages(conversation_id, sender_id, content)VALUES (?, ?, ?)");$stmt->execute([$conversationId, $senderId, $content]);// 更新会话状态$updateStmt = $db->prepare("UPDATE conversationsSET last_message_at = NOW()WHERE id = ?");$updateStmt->execute([$conversationId]);$db->commit();return true;} catch (Exception $e) {$db->rollBack();return false;}}
四、性能优化策略
-
连接管理优化:
- 设置WebSocket心跳间隔(建议30秒)
- 实现连接池复用数据库连接
- 对静态资源启用HTTP缓存
-
消息队列处理:
// 使用Redis实现简单的消息队列function enqueueMessage($queueName, $message) {$redis = new Redis();$redis->connect('127.0.0.1', 6379);return $redis->lPush($queueName, json_encode($message));}function processQueue($queueName) {$redis = new Redis();$redis->connect('127.0.0.1', 6379);while ($message = $redis->rPop($queueName)) {$data = json_decode($message, true);// 处理消息逻辑saveMessage($data['conv_id'], $data['sender'], $data['content']);}}
-
数据库优化:
- 对频繁查询的字段建立复合索引
- 定期执行
OPTIMIZE TABLE整理碎片 - 使用读写分离架构分散压力
五、安全防护措施
-
输入验证:
function sanitizeInput($data) {$data = trim($data);$data = stripslashes($data);$data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8');return $data;}
-
认证授权:
- 实现JWT令牌认证
- 对敏感操作进行RBAC权限控制
- 记录所有管理员操作日志
-
防护机制:
- 限制单IP连接数(建议不超过50)
- 实现防刷屏检测(相同内容5秒内重复3次触发限制)
- 对WebSocket消息大小限制(建议不超过16KB)
六、部署与监控
推荐使用Docker容器化部署方案:
# PHP服务容器FROM php:8.1-fpmRUN docker-php-ext-install pdo_mysqlRUN pecl install redis && docker-php-ext-enable redisCOPY ./src /var/www/htmlWORKDIR /var/www/html# Nginx配置server {listen 80;server_name chat.example.com;location / {try_files $uri $uri/ /index.php?$query_string;}location ~ \.php$ {fastcgi_pass php:9000;include fastcgi_params;}}
监控指标建议重点关注:
- WebSocket连接数
- 数据库查询响应时间
- 消息处理延迟
- 服务器CPU/内存使用率
可通过Prometheus+Grafana搭建可视化监控平台,设置消息积压超过100条时触发告警。
七、扩展功能建议
- 智能路由:集成NLP能力实现问题自动分类
- 多渠道接入:支持网页、APP、小程序等多端统一接入
- 数据分析:统计客服响应时效、用户满意度等关键指标
- 离线消息:实现客服离线时的消息暂存和回拨功能
通过以上技术方案,开发者可以构建出满足企业级需求的在线客服系统。实际开发中建议采用敏捷开发模式,先实现核心聊天功能,再逐步完善周边模块。对于初创团队,可考虑基于开源框架二次开发,重点关注消息实时性和系统稳定性两个核心指标。