开源PHP+Uniapp在线客服系统:全平台搭建指南

一、系统架构设计:PHP后端与Uniapp前端的协同机制

1.1 PHP后端核心模块设计

PHP后端需实现三大核心功能:会话管理、消息路由与用户认证。会话管理模块采用Redis存储会话状态,通过session_start()初始化会话后,将用户ID、设备类型等元数据存入Redis哈希表:

  1. $redis = new Redis();
  2. $redis->connect('127.0.0.1', 6379);
  3. $sessionId = session_id();
  4. $redis->hMSet("session:$sessionId", [
  5. 'user_id' => $_SESSION['user_id'],
  6. 'device' => $_SERVER['HTTP_USER_AGENT'],
  7. 'last_active' => time()
  8. ]);

消息路由模块需处理多渠道消息接入,建议采用发布-订阅模式。通过WebSocket服务(如Ratchet库)实现实时消息推送,结合MySQL事务处理确保消息可靠性:

  1. // 消息持久化示例
  2. $pdo->beginTransaction();
  3. try {
  4. $stmt = $pdo->prepare("INSERT INTO messages (sender, content, timestamp) VALUES (?, ?, ?)");
  5. $stmt->execute([$senderId, $message, time()]);
  6. $pdo->commit();
  7. } catch (Exception $e) {
  8. $pdo->rollBack();
  9. }

1.2 Uniapp跨平台适配策略

Uniapp框架通过条件编译实现多端适配,关键配置文件manifest.json需设置小程序专用参数:

  1. {
  2. "mp-weixin": {
  3. "appid": "your_appid",
  4. "permission": {
  5. "scope.userLocation": {
  6. "desc": "需要获取您的位置信息"
  7. }
  8. }
  9. }
  10. }

针对H5与小程序差异,需在pages.json中配置不同导航栏样式。例如小程序导航栏高度固定为44px,而H5端需动态计算:

  1. // 动态设置导航栏高度
  2. const systemInfo = uni.getSystemInfoSync();
  3. const navHeight = systemInfo.platform === 'android' ? 48 : 44;
  4. this.setData({ navHeight });

二、核心功能实现:从消息收发到智能路由

2.1 实时消息传输方案

WebSocket连接建立需处理重连机制,推荐使用uni.connectSocket封装通用连接方法:

  1. let socketTask = null;
  2. function connectWebSocket(url) {
  3. socketTask = uni.connectSocket({
  4. url: url,
  5. success: () => console.log('连接成功'),
  6. fail: (err) => {
  7. setTimeout(() => connectWebSocket(url), 3000); // 重连机制
  8. }
  9. });
  10. }

消息协议设计建议采用JSON格式,包含type(消息类型)、content(内容)、timestamp(时间戳)等字段。对于图片等大文件,需通过分片上传接口处理。

2.2 智能路由算法实现

客服分配策略可采用加权轮询算法,根据客服技能等级(1-5级)和当前负载计算权重:

  1. function getWeightedAgent($agents) {
  2. $totalWeight = array_reduce($agents, function($sum, $agent) {
  3. return $sum + ($agent['level'] * 10 - $agent['current_sessions']);
  4. }, 0);
  5. $rand = mt_rand(1, $totalWeight);
  6. $current = 0;
  7. foreach ($agents as $agent) {
  8. $current += ($agent['level'] * 10 - $agent['current_sessions']);
  9. if ($rand <= $current) return $agent;
  10. }
  11. }

三、性能优化与安全加固

3.1 数据库查询优化

针对高并发场景,需对messages表进行分表设计。按日期分表策略示例:

  1. CREATE TABLE messages_202310 (
  2. id INT AUTO_INCREMENT PRIMARY KEY,
  3. sender VARCHAR(32),
  4. content TEXT,
  5. timestamp INT
  6. );
  7. -- 动态选择表名
  8. $table = 'messages_' . date('Ym');
  9. $stmt = $pdo->prepare("SELECT * FROM {$table} WHERE sender = ? ORDER BY timestamp DESC LIMIT 20");

3.2 安全防护措施

  1. XSS防护:输出时使用htmlspecialchars()转义
    1. echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
  2. CSRF防护:生成并验证Token
    1. // 生成Token
    2. $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    3. // 验证Token
    4. if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    5. die('非法请求');
    6. }
  3. SQL注入防护:全部使用预处理语句

四、部署与运维方案

4.1 服务器配置建议

  • PHP环境:PHP 7.4+ + Swoole扩展提升并发能力
  • WebSocket服务:独立部署Nginx+Ratchet组合
  • 数据库:主从复制架构,读写分离

4.2 监控告警体系

构建Prometheus+Grafana监控看板,关键指标包括:

  • 消息处理延迟(P99 < 500ms)
  • 并发连接数(峰值< 5000)
  • 数据库查询耗时(平均< 100ms)

五、扩展功能开发指南

5.1 第三方登录集成

以微信登录为例,Uniapp端调用uni.login获取code后传至PHP后端:

  1. uni.login({
  2. provider: 'weixin',
  3. success: (res) => {
  4. uni.request({
  5. url: 'https://your-api.com/auth',
  6. method: 'POST',
  7. data: { code: res.code }
  8. });
  9. }
  10. });

PHP后端通过微信开放平台接口换取openid:

  1. $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$secret}&code={$code}&grant_type=authorization_code";
  2. $response = file_get_contents($url);
  3. $data = json_decode($response, true);
  4. $openid = $data['openid'];

5.2 离线消息处理

设计offline_messages表存储用户离线期间的消息,用户上线时通过WebSocket推送历史消息:

  1. CREATE TABLE offline_messages (
  2. id INT AUTO_INCREMENT PRIMARY KEY,
  3. user_id VARCHAR(32),
  4. content TEXT,
  5. is_read BOOLEAN DEFAULT FALSE,
  6. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  7. );

该方案通过PHP后端提供稳定的服务支撑,结合Uniapp实现跨平台适配,覆盖从基础架构到高级功能的完整开发流程。开发者可根据实际需求调整模块组合,建议先实现核心消息功能,再逐步扩展智能路由、数据分析等高级特性。在性能优化方面,重点监控数据库查询和WebSocket连接数,通过分表分库和连接池技术保障系统稳定性。