新版多语言PHP在线客服系统多商户版:多商户隔离和长连接消息不丢,才是这套源码真正值钱的地方
多商户客服系统,最容易在“隔离”两个字上翻车
普通客服系统装一套,所有商户的会话挤在同一张表里,查询条件带个merchant_id就算隔离了。这种“行级隔离”在数据量小的时候看不出问题,商户一多、会话一涨,查询变慢是次要的,真正致命的是某一次查询条件漏了merchant_id,A商户的客服直接看到了B商户的访客聊天记录。彩虹源码网(www.yuanmaz.com)这次整理的多商户版,隔离方案比单字段过滤更重一层,拿到包后第一件事应该是确认它用的是哪种隔离路径,而不是急着配支付和模板。
路径一:动态域名绑定 + 按subdomain分表
公开的TP5.1多商户客服实现里有一种比较彻底的做法:用ThinkPHP的Route::domain把每个商户绑到一个二级域名,数据库按subdomain字段分表,会话数据物理隔离。路由配置大致是这样的逻辑:Route::domain('${subdomain}.kf.com', ...)->bind('subdomain'),中间件从请求的Host里解析出子域名,映射到对应的商户,后续所有查询自动落在该商户的表里。这种方案的优点是隔离彻底,缺点是商户开通时需要配置二级域名解析,商户数量多了之后域名管理成本会上去。如果你拿到的包route/route.php里有Route::domain的写法,基本就是这条路。
路径二:merchant_id行级隔离 + 动态数据源切换
另一条路更常见,也更适合SaaS化运营:统一域名下,所有业务表带merchant_id字段,中间件在请求进入时识别商户并把标识注入上下文,后续查询自动带上这个条件。部分实现走得更远,用“一主多从”的数据库架构,基础数据(商户信息、系统配置)在主库,会话和客户数据按商户ID分表存储,通过中间件动态切换数据库连接。Workerman社区也有类似做法:从请求头X-Merchant-ID取商户标识,中间件校验有效性后动态Db::connect()到对应的库。这套方案的优势是商户开通不依赖域名,一个入口可以服务所有商户;代价是每一层查询都必须严格带merchant_id,代码层面的纪律要求更高。
判断你拿到的包用的是哪种路径:看route/route.php有没有域名绑定,再看中间件里商户标识是从Host解析的还是从参数/请求头取的。两种路径的部署方式不同,域名绑定需要配解析,参数隔离需要确认二维码和链接里带了商户标识。
Workerman多进程,消息为什么会“丢”
这套系统用Workerman维持长连接,前端访客和坐席端通过WebSocket实时收发消息。单进程跑的时候一切正常,坐席一多、连接数上去,就必须开多进程,而多进程是消息丢失的高发区。
根因:连接对象只活在当前进程里
Workerman的多进程模式下,每个worker进程独立维护自己的连接集合。一个访客的login消息落在进程1,连接对象存在进程1的$connections里;另一条发给这个访客的chat消息被分配到了进程2,进程2的$connections里没有这个连接,消息就发不出去。这不是代码写错了,是多进程架构的天然边界。
解法:Redis Pub/Sub做跨进程广播
公开的实现给出的方案是用Redis Pub/Sub或GlobalData组件做跨进程转发:进程1收到login时,把uid → 进程标识的映射写到Redis;进程2要发消息时,先从Redis查到目标连接在哪个进程,再通过Workerman的Channel组件把消息转发过去。这套源码如果已经集成了Redis,确认service/目录下的Workerman启动配置里有没有Pub/Sub或Channel的初始化逻辑;如果没有,坐席规模超过一两百的时候需要自己补上。上线前单进程测试没问题,不代表多进程没问题,部署时按预期坐席量决定进程数,并把Redis广播链路测一遍。
离线消息和心跳,是两个容易被忽略的配套
长连接断开期间的消息不能直接丢弃,否则访客重连后看不到坐席的回复。公开的实现通常把离线消息写入offline_msg表,拉取时限制最近30天、每次100条,拉取后删除或标记已读;多端登录的场景用is_read字段而不是物理删除,避免一端拉取后另一端看不到。心跳检测同样不能省,前端每30秒发一次ping,服务端回pong,超过90秒没有心跳的连接由定时器清理掉,避免死连接占用资源。这两个机制不配置,表现就是“消息偶尔丢”和“坐席列表里挂着已经关掉页面的访客”。
多语言不是“语言包”,翻译链路和界面切换是两套东西
这类系统声称支持16种甚至20种语言,包括中文简繁体、英、日、韩、法、德、俄、泰、越南、印尼、西班牙、阿拉伯、葡萄牙等。但在线切换界面语言和在线翻译聊天内容是两个独立的功能,需要分开验证。
界面切换:语言包,不依赖外部服务
访客在聊天窗口点一下语言选择,界面文案从对应的语言包读取。这套功能不依赖API,配好语言文件就能用。部分实现还支持根据访客IP自动切换语言,后台也可以手动设置窗口默认语言。部署后先测这一条,确认切换语言后按钮、提示、表单标签都跟着变。
内容翻译:必须对接翻译API,不配就走不通
坐席看不懂访客的语言时,系统需要把聊天内容实时翻译。公开的更新记录显示这类系统通常后台可选百度翻译或谷歌翻译接口,客服回复消息时自动翻译。翻译链路的技术实现是PHP通过HTTP客户端(Guzzle等)向翻译API发送POST请求,携带源文本和目标语言参数,解析返回的JSON拿到译文。API密钥不配置,界面切换仍然可用,但跨语言对话的内容翻译是断的。部署时把百度或谷歌翻译的密钥填进去,测一条“访客发中文,坐席端看到英文译文”的完整链路,才算配通。
机器人自动回复的三级匹配,决定了它“能用”还是“好用”
多语言场景下,机器人如果只靠关键词硬匹配,多语种输入很容易漏。公开的TP5.1实现给出了一个可参考的分层策略:第一级精准匹配,用户输入与qa表里的问题完全一致时直接返回答案;第二级关键词模糊匹配,提取问题中的关键词,在keywords字段做LIKE查询;第三级AI兜底,前两级都没有命中时,调用图灵或类似API生成回复。实测数据是前两级能解决约85%的常见问题,把AI调用成本压下来,也减少等待时间。拿到包后分别测试“知识库有明确答案”和“知识库没有答案”两种输入,就能判断三级匹配是否完整保留,还是只留了前两级。
从环境到扫码聊天,部署顺序不应该从“装宝塔”开始
先确认PHP版本和扩展,再选宝塔组件
同类系统的稳定环境组合是Nginx + PHP 7.2–7.3 + MySQL 5.6 + Workerman。PHP需要pcntl和posix(Workerman常驻进程依赖)、fileinfo,如果源码用Redis做缓存和广播,redis扩展也要装。PHP 8不在推荐范围内,ThinkPHP5系和旧版Workerman在PHP 8下的兼容性没有经过充分验证,没必要给自己增加变量。
运行目录、伪静态和Workerman启动,顺序不能反
源码上传后,运行目录设为public,伪静态选thinkphp,数据库配置写入config/database.php,导入SQL。然后在命令行进入Workerman启动脚本目录执行启动命令(常见php start.php start -d)。Workerman不启动,页面能打开但消息发不出去,表现是发消息转圈或没有回应。启动失败优先查pcntl/posix扩展和WebSocket端口占用。
端口要开两个,不是一个
80/443用于访客网页访问,WebSocket服务端口(常见2346或源码约定端口)需要单独放行。宝塔防火墙和云服务器安全组两边都要开,只开一边等于没开。这是部署后“页面能打开但聊天不通”最常见的原因。
测试闭环:扫码 → 机器人 → 人工接管 → 换商户交叉验证
用手机扫商户后台生成的二维码,打开H5聊天窗口,发一条知识库里有答案的问题确认机器人回复,再发一条没有答案的确认AI兜底或转人工,然后坐席端接管回复一条,确认访客端实时收到。关键一步:同时开两个不同商户的二维码交叉扫码,确认会话不会串到对方商户。这一步验证的是隔离机制是否真正生效,比只测一个商户有意义得多。
包里有什么,上线前盯住三件事
🔥永久赞助9.9(高速下载/无广告/无转存)
✅网盘下载(下载限速/需要转存/有广告)
下载内容清单
下载包通常包含ThinkPHP后端、Workerman启动脚本、平台管理端、商户后台、坐席工作台、H5访客窗口、数据库SQL和安装说明,源码大小在35MB级别。不包含翻译API的免费额度(百度/谷歌翻译需要自行申请密钥)、短信/邮件通道账号和商业级高并发架构。不同整理版本在语言数量、机器人AI兜底的启用状态和后台菜单完整度上可能存在差异。
上线前必须处理的三件事
第一,改默认凭据和后台路径。 流传包的默认后台路径和账号密码是公开信息,不改等于把管理入口暴露出去。第二,扫描application和public目录的可疑文件,重点看有没有来源不明的远程请求或硬编码的外部回调地址。第三,确认Workerman进程配置了守护运行,服务器重启后聊天服务不会自动中断,否则每次重启都要手动拉进程。
多商户数据隔离的最终验证
上线前用两个测试商户各创建一个坐席和一条会话,分别从商户A的后台查询会话列表,确认查不到商户B的数据;再从商户B的坐席端尝试访问商户A的会话ID,确认返回无权限或不存在。隔离机制如果在这一步失效,后面所有运营功能都建立在不可靠的基础上,先解决隔离再谈其他。
免责声明:本文源码介绍与教程由彩虹源码网(www.yuanmaz.com)整理发布,仅供PHP、ThinkPHP和Workerman技术学习及合法客服系统搭建参考。多语言多商户客服系统涉及用户通信数据和商户隔离,运营者须自行确保数据安全、内容合规及翻译API的使用符合对应服务商条款。流传版本的安全性与功能完整性需自行审计,本文不构成对任何特定源码包可用性和安全性的保证。不得用于侵权、违规采集或未经许可的商业分发。
觉得内容不错?我要





