基于Workerman与ThinkPHP的在线客服系统源码解析及搭建指南

一、系统架构与技术选型

1.1 架构设计思路

本系统采用”前端+网关+业务处理”的三层架构设计:

  • 前端层:基于WebSocket的实时通信接口,兼容主流浏览器及移动端
  • 网关层:Workerman作为高性能Socket服务器,处理并发连接与消息路由
  • 业务层:ThinkPHP提供RESTful API服务,处理用户认证、会话管理、消息存储等业务逻辑

这种架构的优势在于:

  • Workerman的纯PHP实现避免了语言切换开销
  • ThinkPHP的MVC模式加速业务开发
  • 水平扩展能力强,可通过增加Worker进程应对高并发

1.2 核心组件选型

  • 通信框架:Workerman 4.0+(支持WebSocket/TCP/UDP)
  • 业务框架:ThinkPHP 6.x(基于PHP 8.1+)
  • 数据库:MySQL 8.0(主从架构)
  • 缓存:Redis 6.0(会话存储与消息队列)
  • 前端:Vue3 + Element Plus(管理后台)

二、源码核心功能实现

2.1 Workerman服务端实现

  1. // worker.php 基础配置示例
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. use Workerman\Worker;
  4. $ws_worker = new Worker("websocket://0.0.0.0:2346");
  5. $ws_worker->count = 4; // 启动4个进程
  6. $ws_worker->name = 'ChatWorker';
  7. $ws_worker->onWorkerStart = function($worker) {
  8. echo "Worker starting... PID:" . posix_getpid() . "\n";
  9. };
  10. $ws_worker->onMessage = function($connection, $data) {
  11. // 消息处理逻辑
  12. $response = [
  13. 'type' => 'message',
  14. 'data' => json_decode($data, true),
  15. 'time' => date('Y-m-d H:i:s')
  16. ];
  17. $connection->send(json_encode($response));
  18. };
  19. Worker::runAll();

关键实现点:

  • 进程管理:通过count参数控制并发进程数
  • 心跳机制:内置onWorkerStop实现优雅退出
  • 协议扩展:支持自定义二进制协议解析

2.2 ThinkPHP业务层实现

  1. // app/controller/Chat.php 示例
  2. namespace app\controller;
  3. use think\Request;
  4. use think\facade\Db;
  5. class Chat
  6. {
  7. public function sendMessage(Request $request)
  8. {
  9. $data = $request->post();
  10. // 参数校验
  11. validate(['content' => 'require|min:5'])->check($data);
  12. // 存储消息
  13. $result = Db::name('chat_messages')
  14. ->insert([
  15. 'user_id' => $data['user_id'],
  16. 'content' => $data['content'],
  17. 'created_at' => time()
  18. ]);
  19. return json(['code' => 200, 'data' => $result]);
  20. }
  21. }

业务层核心功能:

  • 用户认证:JWT令牌管理
  • 会话管理:基于Redis的在线状态追踪
  • 消息存储:分表策略应对海量数据
  • 智能路由:根据业务规则分配客服

三、完整搭建教程

3.1 环境准备

  • 服务器要求:

    • Linux(CentOS 7+/Ubuntu 20.04+)
    • PHP 8.1+(需安装pcntl、posix扩展)
    • Nginx 1.18+(反向代理配置)
    • Supervisor进程管理
  • 依赖安装:
    ```bash

    安装Composer依赖

    composer install

安装Workerman扩展

pecl install channel://pecl.php.net/workerman-0.1.0

  1. ## 3.2 部署步骤
  2. 1. **代码部署**:
  3. - 将源码上传至`/var/www/chat_system`
  4. - 设置目录权限:
  5. ```bash
  6. chown -R www-data:www-data /var/www/chat_system
  7. chmod -R 755 /var/www/chat_system/storage
  1. 配置文件调整

    • 修改.env文件中的数据库配置
    • 设置JWT密钥:APP_SECRET=your_random_string
  2. Nginx配置示例

    1. server {
    2. listen 80;
    3. server_name chat.example.com;
    4. location / {
    5. proxy_pass http://127.0.0.1:8000;
    6. proxy_set_header Host $host;
    7. }
    8. location /ws {
    9. proxy_pass http://127.0.0.1:2346;
    10. proxy_http_version 1.1;
    11. proxy_set_header Upgrade $http_upgrade;
    12. proxy_set_header Connection "upgrade";
    13. }
    14. }
  3. Supervisor配置

    1. [program:chat_worker]
    2. command=php /var/www/chat_system/worker.php start
    3. directory=/var/www/chat_system
    4. user=www-data
    5. autostart=true
    6. autorestart=true
    7. stderr_logfile=/var/log/chat_worker.err.log
    8. stdout_logfile=/var/log/chat_worker.out.log

3.3 性能优化建议

  1. 连接管理优化

    • 设置合理的maxConnections参数(建议5000-10000)
    • 启用reusePort提升多核利用率
  2. 数据库优化

    • 消息表按日期分表(如chat_202310
    • 配置读写分离
  3. 缓存策略

    • 使用Redis集群存储在线用户列表
    • 实现多级缓存(本地缓存+分布式缓存)
  4. 监控体系

    • 集成Prometheus监控Worker状态
    • 设置Grafana看板监控QPS、响应时间等指标

四、扩展功能实现

4.1 智能路由算法

  1. // 客服分配策略示例
  2. class Router
  3. {
  4. public static function assignAgent($userId)
  5. {
  6. // 获取用户标签
  7. $userTags = Db::name('user_tags')->where('user_id', $userId)->select();
  8. // 匹配最佳客服
  9. $bestAgent = Db::name('agents')
  10. ->where('status', 1)
  11. ->whereExists(function($query) use ($userTags) {
  12. $query->select(1)->from('agent_skills')
  13. ->whereColumn('agent_id', 'agents.id')
  14. ->whereIn('skill_id', array_column($userTags, 'tag_id'));
  15. })
  16. ->orderBy('load', 'asc')
  17. ->find();
  18. return $bestAgent ?? self::fallbackAgent();
  19. }
  20. }

4.2 消息持久化方案

采用”实时写入+异步归档”策略:

  1. 消息首先写入Redis Stream
  2. Consumer组消费消息并批量插入MySQL
  3. 定期清理Redis中的已归档数据

五、常见问题解决方案

  1. 连接断开问题

    • 检查防火墙设置(确保2346端口开放)
    • 调整heartbeatCheckInterval参数(建议30-60秒)
  2. 高并发下消息丢失

    • 启用Workerman的transport参数为tcp
    • 实现消息确认机制
  3. ThinkPHP路由冲突

    • route/app.php中明确优先级:
      1. Route::group('chat', function() {
      2. Route::post('send', 'Chat/sendMessage');
      3. })->prefix('app\controller\');

本系统源码包已包含完整实现代码、数据库脚本及详细文档,开发者可通过修改配置文件快速适配不同业务场景。建议部署时采用容器化方案(如Docker Swarm)实现弹性伸缩,应对业务高峰期的流量冲击。