PHP在线客服源码搭建指南:多平台对接实现方案
一、系统架构设计思路
在线客服系统的核心架构需满足高并发、低延迟的实时通信需求。推荐采用分层架构设计:
- 接入层:处理多平台请求的统一入口,通过协议转换适配不同客户端(HTTP/WebSocket/自定义协议)
- 业务逻辑层:实现会话管理、路由分配、消息处理等核心功能
- 数据存储层:采用Redis缓存会话状态,MySQL存储历史记录,消息队列处理异步任务
// 示例:会话状态存储结构$sessionData = ['session_id' => uniqid(),'user_id' => $userId,'operator_id' => $operatorId ?? null,'status' => 'waiting', // waiting|chatting|closed'created_at' => time(),'last_active' => time()];$redis->hMSet("session:{$sessionData['session_id']}", $sessionData);
二、开发环境准备
-
基础环境:
- PHP 7.4+(推荐8.0+)
- Nginx/Apache + PHP-FPM
- MySQL 5.7+ 或 MariaDB 10.3+
- Redis 5.0+
-
依赖管理:
composer require predis/predis # Redis客户端composer require monolog/monolog # 日志系统composer require workerman/workerman # WebSocket服务(可选)
-
目录结构建议:
/project├── config/ # 配置文件├── src/ # 核心代码│ ├── Controller/ # 控制器│ ├── Model/ # 数据模型│ ├── Service/ # 业务服务│ └── Util/ # 工具类├── public/ # 入口文件└── vendor/ # 依赖库
三、核心功能实现
1. 会话管理模块
class SessionService {public function createSession($userId, $platform) {$sessionId = $this->generateSessionId();$session = ['session_id' => $sessionId,'user_id' => $userId,'platform' => $platform,'status' => 'waiting','created_at' => time()];// 存储到Redis$this->redis->hMSet("session:$sessionId", $session);return $sessionId;}public function assignOperator($sessionId) {// 查询空闲客服逻辑$operatorId = $this->findAvailableOperator();if ($operatorId) {$this->redis->hSet("session:$sessionId", 'operator_id', $operatorId);$this->redis->hSet("session:$sessionId", 'status', 'chatting');}return $operatorId;}}
2. 消息路由机制
采用发布-订阅模式实现消息分发:
// 消息生产者$channel = "msg_channel";$message = ['type' => 'text','content' => $userInput,'from' => $userId,'to' => $operatorId,'timestamp' => time()];$this->redis->publish($channel, json_encode($message));// 消息消费者(客服端)$redisSub = new Redis();$redisSub->connect('127.0.0.1', 6379);$redisSub->subscribe(['msg_channel'], function($redis, $channel, $msg) {$message = json_decode($msg, true);// 处理消息并推送给对应客服});
四、多平台对接方案
1. 网页端对接
- 实现方式:WebSocket长连接 + 轮询降级方案
```javascript
// 前端连接示例
const socket = new WebSocket(‘wss://yourdomain.com/ws’);
socket.onmessage = function(e) {
const msg = JSON.parse(e.data);
// 更新聊天界面
};
// 降级方案(当WebSocket不可用时)
function pollMessages() {
fetch(‘/api/messages?last_id=’ + lastMsgId)
.then(res => res.json())
.then(updateUI);
setTimeout(pollMessages, 3000);
}
### 2. 小程序对接- **微信小程序特殊处理**:1. 配置合法域名(request/websocket)2. 使用`wx.connectSocket`建立连接3. 处理小程序特有的鉴权流程```javascript// 小程序WebSocket示例wx.connectSocket({url: 'wss://yourdomain.com/ws',header: {'Authorization': 'Bearer ' + getToken()},success: function() {console.log('WebSocket连接成功');}});
3. 微信公众号对接
- 实现步骤:
- 配置公众号服务器配置(URL、Token、EncodingAESKey)
- 验证消息真实性
- 处理不同类型的消息(文本、图片、事件等)
// 公众号消息验证public function validateSignature() {$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"];$token = "YOUR_TOKEN";$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr, SORT_STRING);$tmpStr = implode($tmpArr);$tmpStr = sha1($tmpStr);if ($tmpStr == $signature) {echo $_GET["echostr"];exit;}return false;}
五、性能优化建议
-
连接管理:
- 设置合理的WebSocket心跳间隔(建议30-60秒)
- 实现连接池管理重连机制
-
消息压缩:
// 消息发送前压缩$compressed = gzcompress(json_encode($message), 9);// 接收方解压$original = gzuncompress($compressed);
-
数据库优化:
- 会话表按日期分表存储
- 历史消息表使用分区表
- 关键查询字段建立索引
六、安全防护措施
-
输入验证:
function sanitizeInput($input) {$input = trim($input);$input = stripslashes($input);$input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');return $input;}
-
防XSS攻击:
- 设置Content Security Policy头
- 使用DOMPurify等库过滤富文本
-
速率限制:
$clientIp = $_SERVER['REMOTE_ADDR'];$key = "rate_limit:$clientIp";$current = $redis->get($key);if ($current >= 100) { // 每分钟100次限制http_response_code(429);exit;}$redis->multi()->incr($key)->expire($key, 60)->exec();
七、部署与监控
-
容器化部署方案:
# 示例DockerfileFROM php:8.0-fpmRUN apt-get update && apt-get install -y \git \unzip \libzip-dev \&& docker-php-ext-install pdo_mysql zipWORKDIR /var/www/htmlCOPY . .RUN curl -sS https://getcomposer.org/installer | php -- \--install-dir=/usr/local/bin --filename=composerRUN composer install --no-dev --optimize-autoloader
-
监控指标:
- 连接数:
INFO keyspace(Redis) - 消息延迟:
LATENCY MONITOR(Redis) - 接口响应时间:Prometheus + Grafana
- 连接数:
通过以上方案,开发者可以构建一个稳定、高效且支持多平台接入的在线客服系统。实际开发中建议采用渐进式开发,先实现核心会话功能,再逐步扩展平台对接和高级特性。