Webman可快速搭建高并发客服后端,关键在WebSocket连接管理(须用Webman\WebSocket\Server)、Redis同步坐席状态、原子化分配客户及异步规则引擎驱动自动回复。

Webman 本身不内置客服系统,但能快速搭建高并发在线客服后端——关键在 WebSocket 连接管理、坐席状态同步和规则引擎接入,而不是堆功能。
WebSocket 连接必须用 Webman\WebSocket\Server 而非原生 Swoole
直接 new Swoole\WebSocket\Server 会绕过 Webman 的生命周期和中间件,导致 Session、日志、异常捕获全部失效。坐席登录态丢失、消息没记录、错误静默是常见后果。
- 必须通过
config/server.php启用'type' => 'websocket',让 Webman 初始化自己的 WebSocket Server - 业务逻辑写在
app\controller\WebSocketController中,onMessage方法里用$fd做连接标识,别存$_SESSION—— 它在协程里不可靠 - 坐席上线时调用
Webman\WebSocket\Server::getInstance()->push($fd, json_encode([...]))广播状态,避免轮询
多坐席状态同步依赖 Redis + 原子操作
多个 Worker 进程无法共享内存,用 PHP 数组或静态变量存坐席列表会导致状态不一致:A 进程看到坐席在线,B 进程却显示离线。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 坐席登录时写入
redis hset staff:status {staff_id} '{"online":1,"last_heartbeat":1715xxxx}',并设 30 秒过期 - 每 15 秒发一次心跳,用
redis hget staff:status {staff_id}检查是否存在,不存在则触发自动登出 - 分配客户给坐席前,用
redis eval脚本执行「取在线坐席 + 随机/轮询 + 标记为忙碌」三步原子操作,防止超卖
自动回复不能硬编码 if-else,要走规则匹配 + 外部引擎
把关键词匹配逻辑写死在 onMessage 里,后期维护成本爆炸:加一条规则就要改代码、重启服务、影响所有连接。
- 用户消息到达后,提取文本主体,调用
http_client->post('http://ai-gateway/reply', ['text' => $text])转给轻量 NLU 服务(如基于 HanLP 或 fastText 训练的小模型) - 兜底用正则规则:配置存数据库表
auto_reply_rules,字段含pattern(PCRE 格式)、reply_content、priority,查询时按 priority DESC 排序 +preg_match匹配 - 禁止在自动回复里调用耗时 DB 查询或外部 HTTP —— 必须异步处理,否则阻塞整个 Worker;可用
Webman\Event::fire('message.replied', [...])触发后续动作
真正难的不是连上 WebSocket 或显示聊天框,而是坐席切换窗口时状态没及时同步、客户重复分配、自动回复误触发——这些都藏在 Redis 过期策略、心跳间隔、规则优先级顺序里,调参比写代码花时间更多。

















