用php+swoole搭建在线客服系统需基于swoole websocket服务器实现长连接,通过table或redis管理会话,taskworker异步处理耗时任务,结合标签匹配与负载策略智能分配客服。

用PHP+Swoole搭建在线客服系统,核心是绕开传统PHP-FPM的“短连接”限制,转而用Swoole提供长连接、协程和异步I/O能力,真正支撑实时消息收发与高并发接入。
WebSocket服务端是基础入口
必须使用Swoole内置的WebSocket服务器(swoole\websocket\server),而非自己封装TCP或HTTP轮询。它原生支持握手、心跳、帧解析与广播,省去大量协议细节处理。
- 监听端口建议设为非80/443(如9501或8080),避免与Web服务器冲突;若需HTTPS支持,前端用Nginx反向代理WebSocket升级请求即可
- 务必开启
heartbeat_check_interval和heartbeat_idle_time,例如60秒检测、300秒超时,防止僵尸连接堆积 - 连接建立时,通过
$request->get或$request->header校验token或微信code,绑定真实用户ID(如openid或uid)到fd,后续消息路由才可精准触达
连接状态与会话需轻量级管理
不能每次收消息都查数据库——高频操作必须降级到内存层。Swoole的Table结构或Redis是最常用方案。
-
Table适合单机部署:定义共享内存表缓存活跃连接(fd → uid、session_id、上线时间),读写O(1),无网络开销 - Redis适合集群场景:用Hash存储会话元数据(
HSET session:123 uid 1001 status online),用Sorted Set维护客服负载(ZADD support:load 3 "support_001") - 用户断线后,
close回调中及时清理Table或Redis中的记录,避免“幽灵会话”干扰路由逻辑
消息分发要兼顾实时性与可靠性
用户发来的消息不能直接由Worker进程同步处理并推送,否则高负载下易阻塞。应按类型分流:
- 纯文本聊天、输入状态(typing)、已读回执等低延迟指令,走Worker内协程即时响应
- 消息存库、通知第三方系统、生成工单等耗时操作,交由
taskworker异步执行,主Worker保持响应通畅 - 向目标客服推送时,先查其fd是否在线(查
Table或Redis),再调$server->push($fd, $msg);若离线,将消息写入MySQL+Redis队列,待上线后拉取
客服分配需策略化,不止轮询
简单轮询无法应对技能匹配、排队优先级、当前负载等现实需求。推荐在路由层引入轻量决策逻辑:
- 为每个客服设置标签(如“英语”“支付问题”“VIP专线”),用户进线时携带问题类型或客户等级,匹配最相关客服
- 统计各客服当前会话数(
current_session)与最大承载(max_session),只分配给current 者 - 新用户默认进入等待队列(Redis List),有空闲客服时由定时器或事件触发主动拉取,避免空转轮询
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











