PHP在线客服源码搭建指南:多平台对接实现方案

PHP在线客服源码搭建指南:多平台对接实现方案

一、系统架构设计思路

在线客服系统的核心架构需满足高并发、低延迟的实时通信需求。推荐采用分层架构设计:

  1. 接入层:处理多平台请求的统一入口,通过协议转换适配不同客户端(HTTP/WebSocket/自定义协议)
  2. 业务逻辑层:实现会话管理、路由分配、消息处理等核心功能
  3. 数据存储层:采用Redis缓存会话状态,MySQL存储历史记录,消息队列处理异步任务
  1. // 示例:会话状态存储结构
  2. $sessionData = [
  3. 'session_id' => uniqid(),
  4. 'user_id' => $userId,
  5. 'operator_id' => $operatorId ?? null,
  6. 'status' => 'waiting', // waiting|chatting|closed
  7. 'created_at' => time(),
  8. 'last_active' => time()
  9. ];
  10. $redis->hMSet("session:{$sessionData['session_id']}", $sessionData);

二、开发环境准备

  1. 基础环境

    • PHP 7.4+(推荐8.0+)
    • Nginx/Apache + PHP-FPM
    • MySQL 5.7+ 或 MariaDB 10.3+
    • Redis 5.0+
  2. 依赖管理

    1. composer require predis/predis # Redis客户端
    2. composer require monolog/monolog # 日志系统
    3. composer require workerman/workerman # WebSocket服务(可选)
  3. 目录结构建议

    1. /project
    2. ├── config/ # 配置文件
    3. ├── src/ # 核心代码
    4. ├── Controller/ # 控制器
    5. ├── Model/ # 数据模型
    6. ├── Service/ # 业务服务
    7. └── Util/ # 工具类
    8. ├── public/ # 入口文件
    9. └── vendor/ # 依赖库

三、核心功能实现

1. 会话管理模块

  1. class SessionService {
  2. public function createSession($userId, $platform) {
  3. $sessionId = $this->generateSessionId();
  4. $session = [
  5. 'session_id' => $sessionId,
  6. 'user_id' => $userId,
  7. 'platform' => $platform,
  8. 'status' => 'waiting',
  9. 'created_at' => time()
  10. ];
  11. // 存储到Redis
  12. $this->redis->hMSet("session:$sessionId", $session);
  13. return $sessionId;
  14. }
  15. public function assignOperator($sessionId) {
  16. // 查询空闲客服逻辑
  17. $operatorId = $this->findAvailableOperator();
  18. if ($operatorId) {
  19. $this->redis->hSet("session:$sessionId", 'operator_id', $operatorId);
  20. $this->redis->hSet("session:$sessionId", 'status', 'chatting');
  21. }
  22. return $operatorId;
  23. }
  24. }

2. 消息路由机制

采用发布-订阅模式实现消息分发:

  1. // 消息生产者
  2. $channel = "msg_channel";
  3. $message = [
  4. 'type' => 'text',
  5. 'content' => $userInput,
  6. 'from' => $userId,
  7. 'to' => $operatorId,
  8. 'timestamp' => time()
  9. ];
  10. $this->redis->publish($channel, json_encode($message));
  11. // 消息消费者(客服端)
  12. $redisSub = new Redis();
  13. $redisSub->connect('127.0.0.1', 6379);
  14. $redisSub->subscribe(['msg_channel'], function($redis, $channel, $msg) {
  15. $message = json_decode($msg, true);
  16. // 处理消息并推送给对应客服
  17. });

四、多平台对接方案

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);
}

  1. ### 2. 小程序对接
  2. - **微信小程序特殊处理**:
  3. 1. 配置合法域名(request/websocket
  4. 2. 使用`wx.connectSocket`建立连接
  5. 3. 处理小程序特有的鉴权流程
  6. ```javascript
  7. // 小程序WebSocket示例
  8. wx.connectSocket({
  9. url: 'wss://yourdomain.com/ws',
  10. header: {
  11. 'Authorization': 'Bearer ' + getToken()
  12. },
  13. success: function() {
  14. console.log('WebSocket连接成功');
  15. }
  16. });

3. 微信公众号对接

  • 实现步骤
    1. 配置公众号服务器配置(URL、Token、EncodingAESKey)
    2. 验证消息真实性
    3. 处理不同类型的消息(文本、图片、事件等)
  1. // 公众号消息验证
  2. public function validateSignature() {
  3. $signature = $_GET["signature"];
  4. $timestamp = $_GET["timestamp"];
  5. $nonce = $_GET["nonce"];
  6. $token = "YOUR_TOKEN";
  7. $tmpArr = array($token, $timestamp, $nonce);
  8. sort($tmpArr, SORT_STRING);
  9. $tmpStr = implode($tmpArr);
  10. $tmpStr = sha1($tmpStr);
  11. if ($tmpStr == $signature) {
  12. echo $_GET["echostr"];
  13. exit;
  14. }
  15. return false;
  16. }

五、性能优化建议

  1. 连接管理

    • 设置合理的WebSocket心跳间隔(建议30-60秒)
    • 实现连接池管理重连机制
  2. 消息压缩

    1. // 消息发送前压缩
    2. $compressed = gzcompress(json_encode($message), 9);
    3. // 接收方解压
    4. $original = gzuncompress($compressed);
  3. 数据库优化

    • 会话表按日期分表存储
    • 历史消息表使用分区表
    • 关键查询字段建立索引

六、安全防护措施

  1. 输入验证

    1. function sanitizeInput($input) {
    2. $input = trim($input);
    3. $input = stripslashes($input);
    4. $input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
    5. return $input;
    6. }
  2. 防XSS攻击

    • 设置Content Security Policy头
    • 使用DOMPurify等库过滤富文本
  3. 速率限制

    1. $clientIp = $_SERVER['REMOTE_ADDR'];
    2. $key = "rate_limit:$clientIp";
    3. $current = $redis->get($key);
    4. if ($current >= 100) { // 每分钟100次限制
    5. http_response_code(429);
    6. exit;
    7. }
    8. $redis->multi()
    9. ->incr($key)
    10. ->expire($key, 60)
    11. ->exec();

七、部署与监控

  1. 容器化部署方案

    1. # 示例Dockerfile
    2. FROM php:8.0-fpm
    3. RUN apt-get update && apt-get install -y \
    4. git \
    5. unzip \
    6. libzip-dev \
    7. && docker-php-ext-install pdo_mysql zip
    8. WORKDIR /var/www/html
    9. COPY . .
    10. RUN curl -sS https://getcomposer.org/installer | php -- \
    11. --install-dir=/usr/local/bin --filename=composer
    12. RUN composer install --no-dev --optimize-autoloader
  2. 监控指标

    • 连接数:INFO keyspace(Redis)
    • 消息延迟:LATENCY MONITOR(Redis)
    • 接口响应时间:Prometheus + Grafana

通过以上方案,开发者可以构建一个稳定、高效且支持多平台接入的在线客服系统。实际开发中建议采用渐进式开发,先实现核心会话功能,再逐步扩展平台对接和高级特性。