
简介这套PHP在线客服系统是2021年12月修复的完整可用版本基于PHPlivechat深度整理支持无限坐席并附带安卓手机APP客服端适合中小网站、电商平台及个人站长快速搭建Web与移动端一体的实时客服能力。资源包共451个文件主要包含122个JS交互脚本、110个PNG界面素材、100个PHP后台逻辑文件、23个HTML页面同时配有样式CSS、字体文件、演示图及部署教程压缩后约133.83MB。系统已适配宝塔面板Linux/Windows环境要求PHP 5.6以上、Apache 2.4.41即可运行无需手工修改数据库配置或导入SQL访问域名后按安装向导填写信息即可完成部署。附带的安卓客服APP支持扫码绑定后台方便管理者随时随地处理客户会话资源内还提供了APP使用教程与后台操作截图降低上手门槛。目前已有1102人学习下载对需要快速上线稳定在线客服、又想保留移动端管理入口的中小团队具有较高参考价值。1. 这个 PHPlivechat 修复版到底解决什么问题看到“2021年12月修复版”这个后缀先别把它当成官方新版本。PHPlivechat 是很早期的 PHP 在线客服系统官方早已停止大版本更新市面上流传的包大多是别人在原版基础上改出来的去掉授权和坐席数限制、补上 PHP 7/8 的函数兼容、修掉数据库连接问题再重新打包。这套源码的价值不在功能迭代而在“还能用”——让一个停留在 PHP 5 时代的系统能在今天的服务器上跑起来并且自带手机 APP 客服端客服不用死守在电脑前面。这篇文章会把整条链路讲清楚怎么部署起来、无限坐席的真实边界在哪里、手机 APP 怎么接入后端、以及这种修复版最常见的踩坑点。适合想私有化部署、又不想按坐席给 SaaS 平台长期付费的中小团队。2. 先把 PHPlivechat 跑起来环境选型与最小部署2.1 PHP 版本怎么选7.4 最稳别盲目上 PHP 8判断一个老 PHP 项目能不能跑第一件事不是看代码而是看它用了哪些“活不过新版本”的函数。PHPlivechat 这类系统里最常见的三个死亡标记mysql_*系列函数在 PHP 7.0 被移除、each()在 PHP 8.0 被移除、mcrypt扩展在 PHP 7.2 转入 PECL。修复版的目的就是把这些坑填平但填得干不干净只有装上去才知道。我的建议是能选 PHP 7.4 就选 7.4。这个修复版标题里写的是“2021年12月修复”那个时间点 PHP 8.0 刚发布不到一年绝大部分修复工作都是针对 PHP 7.2/7.4 做的所谓“兼容 PHP 8”很多只兼容了个皮毛。数据库配 MySQL 5.7Web 服务器用 Nginx这两个组合在宝塔面板里都是一键切换出问题也好回退。如果你手上只有 phpStudy同样把 PHP 版本切到 7.4 再建站点。2.2 解压、放站点与目录权限下载下来的包通常是一个 zip解压后会看到几个关键目录client访客聊天窗口、operator客服工作台、admin管理后台以及安装向导目录。先把整个包传到网站根目录然后重点处理目录权限。常见目录结构与权限要求如下目录/文件作用最小权限建议说明/client访客端聊天窗口可读即可前端页面和 JS 资源/operator客服工作台可读即可客服登录后的操作界面/admin管理后台可读即可管理员配置坐席、部门配置文件如config.php数据库连接参数可读强烈建议禁止 Web 访问里面是数据库账号密码日志/上传目录聊天记录缓存、文件传输需要写入权限宝塔里示例配置是logs、upload在宝塔中操作路径站点设置 → 文件权限把上述需要写入的目录所有者设为www权限设为755或775。这一步漏掉最典型的表现是访客端发消息时报“无法写入缓存”但页面看起来一切正常。2.3 导入数据库与安装引导解压包里一般会带一个.sql文件文件名通常是database.sql或livechat.sql。在宝塔的 phpMyAdmin 里可以直接导入但数据量大时更容易出问题的是超时。我习惯用命令行导入更可控mysql -uroot -p -h 127.0.0.1 --default-character-setutf8mb4 phplivechat /tmp/database.sql说明-u指定数据库用户-p表示要输入密码-h是数据库地址本地环境用127.0.0.1即可。--default-character-setutf8mb4这个参数很关键老 SQL 文件里可能是utf8统一按utf8mb4导入避免后面中文聊天记录出现乱码。phplivechat是你要导入的目标数据库名需要先用CREATE DATABASE phplivechat CHARACTER SET utf8mb4;建好。导入完成后访问你的站点域名正常情况下会进入安装引导页填写数据库地址、库名、账号密码。如果直接打开域名发现没有引导而是报错常见原因是config.php已经存在且内容不完整删掉它再刷新。2.4 登录后台和访客端自测安装完成后把三个地址分别打开测试访客端http://你的域名/client能弹出聊天窗口即可先发一条测试消息。客服端http://你的域名/operator用初始管理员账号登录看能否看到访客发来的会话。管理后台http://你的域名/admin确认坐席列表、部门设置可以正常打开。如果访客端消息能发出、客服端能收到部署环节就通过了。剩下的事情大多是权限和参数调优。3. “无限坐席”的边界在哪授权、数据表和并发参数3.1 判断这个修复版有没有真的去掉坐席限制所谓“无限坐席”在这个系统里的技术含义有两层第一层是数据库里能创建多少个客服账号第二层是同一时刻有多少客服能保持在线状态。原版 PHPlivechat 对账号数有授权校验常见做法是向授权服务器发起请求校验失败就拒绝添加坐席修复版一般把这段校验移除了所以后台添加坐席再也不会弹“已到达授权上限”。验证方法很简单进管理后台的“坐席管理”连续添加两个客服账号看是否有任何拦截提示。如果真的有一个明确上限那说明修复不彻底如果一直能加那就是“账号层面无限”。但要注意账号无限不代表能扛住无限并发这一点在 3.3 节里展开。3.2 坐席账号怎么加后台操作与 SQL 补录推荐直接用管理后台添加坐席密码和权限由系统自动处理。但有些修复版后台存在 bug比如“新增坐席”按钮点了没反应这时候就得走数据库补录。先查表名前缀PHPlivechat 的表前缀在不同版本里不一样可能是lc_也可能是livechat_。下面以lc_operator为例SELECT id, name, login, role, enabled FROM lc_operator WHERE login agent01;说明name是坐席显示名login是登录账号role控制权限级别常见取值有admin和operatorenabled为 1 表示启用。如果这个包用的是老式密码存储password字段是 32 位 MD5如果修复版改成了password_hash()字段长度会是 60 位左右。插入坐席时对应写成-- 老式存储MD5 加密 INSERT INTO lc_operator (name, login, password, role, enabled) VALUES (技术客服, agent01, MD5(your_password), operator, 1);-- 新式存储password_hash先用 PHP 生成哈希再写入 SELECT PASSWORD(your_password);两条 SQL 的差异在于密码哈希算法。判断该用哪条看现有管理员的password字段长度即可。插完以后去客服端试登录如果登录失败把字段名和表名再核对一遍——有些版本用的是login_name而不是login。3.3 坐席数上去了并发怎么调一套能抄的参数表坐席账号可以无限加但每个在线坐席都会保持一条 HTTP 长轮询连接。PHPlivechat 的老架构本身就是靠长轮询模拟实时推送坐席打开的客服工作台会一直挂着一个等待新消息的请求。这意味着坐席在线数 PHP-FPM 占用进程数 MySQL 连接数的影响因子。推荐从这套参数起步参数建议初始值说明PHP-FPMpm.max_children50每个在线坐席至少消耗 1 个 PHP 进程PHP-FPMpm.start_servers10启动时预留的进程数PHPmax_execution_time30长轮询单次请求超时时间建议 25~30 秒MySQLmax_connections200长轮询会占用 MySQL 连接尤其聊天写入频繁时长轮询心跳间隔20 秒前端每 20 秒发起一次新请求服务端set_time_limit(30)足够进程数不是越大越好。max_children开太大内存不够时会频繁 swap反而把聊天响应拖慢。常见的错误是把max_execution_time设成 0等于让 PHP 进程无限挂起一旦坐席忘记关页面进程就永远不释放最终 MySQL 连接数被打满。3.4 真正的瓶颈在哪修复版只能解除授权限制解不了架构瓶颈。几十个坐席同时在线这套 PHP MySQL 长轮询的架构问题不大到一两百坐席最先被击穿的通常是 MySQL 连接数和 PHP-FPM 进程数而不是 CPU。如果你需要撑更大的规模常见做法是做一个消息队列层把聊天消息先写入 Redis 或 RabbitMQ再由后端进程批量落库坐席端的轮询改为读队列。到这一步PHPlivechat 本身已经只是个前端壳了数据流全在你自己手里。能做这种改造的团队通常也不会再纠结“无限坐席”这种说法他们关心的是单位成本下的真实并发。4. 手机 APP 客服端接入接口、轮询与抓包联调4.1 为什么 APP 不能直接用网页端的 session网页客服端登录后PHP 会在服务端写 session浏览器靠 Cookie 维持身份。APP 里没有 Cookie 管理这一说而且 session 文件锁会让同一个账号的多个请求互相排队。所以这类系统带 APP 时后端都会额外提供一个基于 token 的接口层登录接口返回 token后续所有请求都带 token服务端不再依赖 session。这套设计和现在的主流 API 鉴权是一样的思路。4.2 一套典型的 APP 接口结构我一般会在拿到包后先翻mobile或api目录把登录、会话列表、发消息、轮询这四个接口找出来。修复合集里的接口命名可能不统一但结构大致如下接口方法参数返回/api/operator/loginPOSTlogin,passwordtoken,nickname/api/chat/pendingGETtoken未接入会话列表/api/chat/sendPOSTtoken,session_id,messagemessage_id/api/chat/pollGETtoken,last_id新消息列表注意上面是通用化的示意不一定和你的包完全一致。拿到包以后先用文本编辑器搜关键词比如pending、last_id、operator/login通常能直接在 PHP 文件里找到路由定义。4.3 用 curl 做一次最小联调假设后端已经把接口暴露在http://你的域名/api/operator/login用 curl 验证登录接口curl -X POST http://你的域名/api/operator/login \ -H Content-Type: application/json \ -d {login:agent01,password:your_password}说明-X POST指定请求方法-H设置请求头-d是 JSON 格式的请求体。返回结果里如果包含token说明接口通路正常。如果返回 404先确认 Nginx 伪静态规则是否放行了api目录如果返回“密码错误”去数据库里把password字段改成MD5(your_password)再试很多修复版虽然改了 PHP 函数但密码校验逻辑还是老的。拿到 token 后拉取新会话curl http://你的域名/api/chat/pending?token你的token这一步能过APP 和后端的交互路径就没问题了。后面的工作全部落在 APP 端怎么解析字段上。4.4 轮询节奏、session 锁与抓包验证APP 端的消息接收老版本做得多的还是轮询而不是长连接。实现上要避免两个问题一是轮询间隔太短比如 2 秒一次坐席一多后端压力翻倍二是 APP 请求和网页端共用 session导致互相阻塞。靠谱的做法是在 APP 接口的 PHP 入口里显式调用session_write_close()提前释放 session 锁再继续执行轮询逻辑。联调阶段最实用的是 Fiddler 抓包。在电脑上打开 Fiddler开启 HTTPS 解密并监听 8888 端口手机和电脑连同一个 Wi-Fi在手机的 Wi-Fi 设置里把 HTTP 转发地址指向电脑IP:8888。然后操作 APP 登录、进会话、发消息Fiddler 里能看到每个请求的完整报文字段名、JSON 结构、返回码一目了然。遇到“APP 能进登录页但进不了会话列表”这类问题抓包十分钟通常比猜代码一天更有效。5. 这个修复版最常见的 3 个坑与验证方法5.1track_errors is no longer available的快速处理如果你把环境切到了 PHP 8启动时遇到fatal error: directive track_errors is no longer available in php这是 PHP 8 移除track_errors指令导致的。修复版可以兼容旧语法但不会替你把 php.ini 里的过期指令清理掉。处理方式在 PHP 配置文件中注释掉或删除这一行然后重启 PHP 服务。顺带检查一下有没有mysql_*函数残留php -m能列出扩展但函数级检查得靠搜索源码目录里的mysql_query之类字样。说实话要用 PHP 8 就要接受这种“今天修一个、明天又冒一个”的状态老老实实切回 7.4 更省事。5.2 HTTPS 下的接口地址与中文乱码部署在 HTTPS 环境时APP 接口地址一定要用https://开头否则会连不上。这个系统的访客端和客服端之间的地址是写在前端配置里的换域名或换协议后记得回后台把“服务器地址”同步更新。中文乱码问题检查三处数据库连接是否指定了utf8mb4、数据库表和字段排序规则是否为utf8mb4_general_ci、APP 接口返回时是否设置了Content-Type: application/json; charsetutf-8。三处都对齐乱码基本消失。5.3 用两个坐席手机端做一次真实验证要验证这套系统是否真的能同时支撑多个手机 APP 客服端最直接的办法是双机双账号实测。准备两个不同账号分别登录两台手机上的 APP然后从访客端发起会话看两个坐席能否同时收到会话、能否同时回复同一访客。这一步能暴露大量隐藏问题比如第二台手机收不到消息多半是 token 存储冲突比如两个账号互相挤下线大概率是 session 机制没改干净。验证并发时看两个数字Threads_connected表示当前 MySQL 连接数php-fpm进程数可以直接用ps aux | grep php-fpm | wc -l统计。在固定坐席数量的前提下轮询请求到达时这两个数字会同步上升请求结束后回落。如果只涨不落说明请求超时时间设置太长长轮询把进程挂死了。这一步验证完对整个系统的并发边界就有了明确认知能用、能改、上限在哪心里全有数。本文还有配套的精品资源点击获取