拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PHPlivechat部署实战:无限坐席客服系统与APP客户端搭建指南

简介一套基于2021年12月修复版的PHP在线客服系统采用PHPlivechat方案支持无限坐席并附带Android手机APP客服端与搭建教程。面向需要快速搭建客服系统的个人站长、中小企业或开发者可解决网站实时沟通、多坐席协作等需求。资源包共451个文件压缩后约133.83MB主体为100个PHP逻辑文件、122个JS交互脚本、110张PNG界面素材辅以23个HTML页面、13个CSS样式及SQL数据库文件还包含APK安装包与音频、视频教程结构完整。已有1102人学习下载。资源亮点是安装流程已优化无需手工修改源码或导入数据库按向导即可完成部署手机APP支持扫码绑定后台便于移动管理。教程配有截图与文字指引可帮助快速上手适合有一定服务器基础的学习者。1. 为什么还在用PHP写的PHPlivechat无限坐席与APP客服端到底解决什么问题先给结论如果你的业务需要一套能自己控制数据的在线客服系统PHP写的PHPlivechat依然是性价比最高的一条路尤其是这个号称“2021年12月修复版”的包——它在老版本的易用性基础上解决了PHP 7.x环境下最常见的报错还带一套可以直接打包的APP客服端。你可能觉得PHP做客服系统太土但换个角度想虚拟主机能跑、宝塔能跑、一台1核2G的服务器也能跑这对绝大多数中小网站和电商站长来说恰恰是最现实的方案。这套系统解决的是三个具体问题一是访客在网页上发起咨询时客服能实时收到并回复二是客服不用一直守在电脑前APP端能带着会话跑三是“无限坐席”意味着你不需要按人头付费也不用在用户表里去数客服账号。往下我会先把部署流程拆开讲清楚再解释无限坐席的实现逻辑然后带你把APP端跑起来最后把常见问题列成清单。适合谁看准备给公司或客户搭客服系统的人、在用第三方客服软件但嫌贵的站长、以及想拿PHP源码做二次开发的从业者。2. 从零部署PHPlivechatLNMP环境、权限配置与数据库初始化2.1 环境选型PHP 7.4还是PHP 5.6扩展与伪静态怎么定部署PHPlivechat之前先把环境想清楚。官方老版本对PHP 5.6支持得最好但2021年这个修复版的主要目的就是把老代码搬到PHP 7.x上跑所以我建议你直接用PHP 7.4兼顾兼容性和安全性。PHP 8.0以上暂时别碰老代码里的一些写法在PHP 8下会直接抛致命错误例如each()函数被移除、count()对非数组的报错级别提高修复版未必覆盖到这些边界。在宝塔面板里创建站点时PHP版本选7.4运行目录指向web文件夹。如果你的源码包没有明确标注目录结构常见做法是将压缩包解压后把web目录作为站点根目录因为PHPlivechat的入口文件和静态资源都在这里。装完面板后还需要给PHP安装这几个扩展pdo_mysql、openssl、mbstring、curl、fileinfo这些在宝塔的PHP扩展管理里都是开关式安装。fileinfo容易被忽略但它负责上传图片时读取文件类型少了它客服端传头像会出错。伪静态配置也要说清楚Nginx环境下加入下面这段规则目的是让URL去掉index.php让客服系统内部的跳转和资源加载走正常路径。location / { if (!-e $request_filename){ rewrite ^/(.*)$ /index.php?r$1 last; } }这段配置的含义是当请求的路径不是一个真实存在的文件或目录时把请求重写到index.php并带上原始路径作为r参数。PHPlivechat基于Yii框架它的路由入口就是index.php所以这条规则必须配上否则访客打开聊天窗口时会看到404。还有一个容易翻车的点PHP的disable_functions里如果有proc_open、exec、shell_exec一些跑定时任务的版本会静默失败。排查办法是打开探针或者写一个?php echo phpinfo(); ?页面去查。我习惯把proc_open从禁用列表里放出来因为某些版本的修复版会用它在后台生成桌面通知进程。2.2 目录权限、数据库导入与管理端登录三步把系统跑起来环境就绪后开始正式安装。先说明这个包的安装过程本质上是“解压 → 导库 → 改配置 → 登录”没有复杂的编译步骤但每一步都有讲究。第一步把压缩包里的全部文件上传到站点根目录后执行权限调整命令。Yii框架有runtime目录和assets目录必须可写否则页面能打开但缓存写不进去报错信息千奇百怪。chown -R www:www /www/wwwroot/你的站点目录 chmod -R 755 /www/wwwroot/你的站点目录 chmod -R 777 /www/wwwroot/你的站点目录/web/assets chmod -R 777 /www/wwwroot/你的站点目录/runtimewww:www是宝塔的默认运行用户PHP-FPM以这个用户身份执行如果文件属主是rootPHP进程就没有写权限。assets目录专门放Yii发布的前端资源副本每访问一次可能生成新的文件权限不足直接白屏。runtime目录存应用日志和缓存权限不足时系统会尝试写日志失败表现为页面打开极慢。第二步创建数据库并导入SQL文件。大多数源码包会带一个database.sql或db.sql用命令行导入比图形界面更不容易出字符集问题。mysql -uroot -p你的密码 -e CREATE DATABASE IF NOT EXISTS livechat DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; mysql -uroot -p你的密码 livechat database.sqlutf8_general_ci是PHPlivechat老代码最安全的字符集选择utf8mb4虽然能存emoji但老程序建表的字段长度可能以utf8字节数计算换编码后索引会超出长度限制导致导入报错。数据库名随意但后面配置文件里要跟着改。第三步修改数据库连接配置。配置文件一般在web/protected/config/database.php内容类似?php return array( connectionString mysql:hostlocalhost;dbnamelivechat, username 你的数据库用户, password 你的数据库密码, charset utf8, );改完保存打开http://你的域名/index.php?rsite/login默认管理账号通常是admin初始密码源码包的文档里会写拿不到文档就试admin或admin123这种常见组合修复版一般不会把初始密码设得太复杂。登录后第一件事是去「系统设置」里把后台路径和密码改掉。2.3 验证访客入口把聊天窗口嵌到任意网页的最小代码系统装好以后要在自己的网站上挂一个“在线咨询”按钮。PHPlivechat管理后台会有“代码生成器”生成一段JavaScript嵌入代码。代码的核心逻辑是通过iframe或动态脚本加载聊天窗口而不是把整个PHP应用嵌进去。script typetext/javascript var phpLiveChat { serverUrl: https://你的域名, style: float, color: #007aff, buttonText: 在线咨询 }; /script script typetext/javascript srchttps://你的域名/js/visitor.js/scriptserverUrl必须是完整的站点地址末尾不要带斜杠style设成float会在右下角浮出一条按钮设成page则嵌入页面内部color控制按钮主色。visitor.js这个文件在站点的js目录下它会在页面加载完成后建立与客服端的连接。嵌入后怎么确认跑通了打开访客页面右下角能看到按钮点击后弹出聊天窗口随便发一句话然后登录客服后台看是否有会话进来。如果聊天窗口出现但发送消息没反应优先检查浏览器控制台里有没有报403或跨域错误。3. 坐席机制与无限坐席授权校验卡在哪、怎么改才不出事3.1 坐席模型的底层逻辑操作员表、分组与会话分配PHPlivechat把客服人员统一叫“操作员”在数据库里对应user表每个操作员有一个role字段区分身份。role0是普通访客role1是管理员role2是客服坐席。坐在后台的客服本质上就是拿着role2的账号登录到后台然后通过轮询或WebSocket接收访客会话。会话分配的逻辑分两层第一层是按部门分组操作员属于哪个部门就只能看到哪个部门的会话第二层是自动分配策略系统默认是“轮流分配”即访客发起对话时按操作员的登录顺序依次派单保证不会某个客服积压太多、另一个闲得慌。这个策略在后台可以改成“空闲优先”但说实话老版本的实现不算聪明它只判断操作员是否在线不判断当前正在处理多少会话所以并发高的时候还是人工手动转接更靠谱。这里要注意一个概念无限坐席不是说系统支持无限个同时登录的客服而是说它对“创建客服账号”这个动作不做数量限制。原版PHPlivechat的商业授权版本才支持多坐席免费版限制只能用1个或2个坐席而这个修复版把坐席判断逻辑跳过了所以你新增第10个、第20个客服账号都能正常登录工作。3.2 授权校验的本地化处理找到license调用点并屏蔽网络请求实现“无限坐席”的本质是让程序不再向授权服务器发送验证请求。老版本的程序会在后台登录时定期向官方域名发一个curl请求校验当前域名是否在白名单内校验失败就退出登录或冻结坐席功能。修复版做的事情说穿了就是把这段校验代码注释掉或改成直接返回成功。常见做法是在源码里搜索license关键词因为修复版一般不重写整个框架只是改掉关键文件。实际操作时我用下面这段命令在源码目录里搜索授权相关调用的位置grep -rn license /www/wwwroot/你的站点/web/protected/ --include*.php | grep -v vendor/搜索结果通常集中在protected/components/目录下比如LicenseComponent.php或web/Config.php里的checkLicense()方法。打开这个文件你大概率能看到类似下面的代码public function checkLicense() { $result file_get_contents(https://api.example.com/license?domain . $_SERVER[HTTP_HOST]); $result json_decode($result, true); if ($result[code] ! 200) { return false; } return true; }要让它不再联网校验又不影响程序其他逻辑最稳妥的办法是把函数的返回直接改为truepublic function checkLicense() { return true; // 原有网络请求代码保留但不再执行 }改完之后登录后台、访客发起会话、客服回复这三条链路里都不会再触发外部网络请求。这个改法有个好处就算程序在别的文件里也调用了checkLicense()统一从这个入口返回覆盖面最广。比直接注释掉所有调用点更靠谱因为你可能会漏掉隐藏在某个控制器里的第二处调用。3.3 放开坐席上限后必须重新初始化的三件事屏蔽授权校验只是第一步放开坐席上限后还有三件事必须做少一件都会出现“看着能用但其实有问题”的状态。第一件清空缓存目录。Yii框架会把配置和路由信息缓存到runtime/cache下改动PHP文件后不清理缓存老代码仍然被执行。执行下面这行命令然后刷新后台rm -rf /www/wwwroot/你的站点/runtime/cache/*第二件重建数据表索引。修改坐席逻辑后你需要确认user表里的客服账号能正常被会话分配调度。执行一段SQL给操作员登录状态加上索引防止并发登录时锁表ALTER TABLE livechat.user ADD INDEX idx_role_status (role, status);索引的作用是让“查询所有在线的客服人员”这个动作走索引而不是全表扫描。如果之前已经加过这个索引执行会报重复键名的错误忽略即可。这一步不是必须的但加了索引后十几个客服同时在线的场景下访客发起会话的响应速度会有明显改善。第三件修改密码策略。新增大量坐席账号后如果admin密码还是默认密码等于给系统留了后门。到后台「操作员管理」里重置所有测试账号的密码同时确认config/main.php中的enableCookieValidation和cookieValidationKey已经有值components array( request array( enableCookieValidation true, cookieValidationKey 改成一段随机字符串, ), ),cookieValidationKey为空时会话Cookie存在被伪造的风险攻击者构造一个非法Cookie可能导致登录绕过。随机字符串可以用openssl rand -hex 16生成然后粘贴进去。改完这个配置所有已登录的用户全部要重新登录这是正常现象。4. 手机APP客服端Android端打包、服务器地址配置与消息推送4.1 APP端文件结构与服务器地址定位“带手机APP客服端”是这个包的核心卖点。APP端的本质是给客服在手机上处理会话不是给访客用的。它的实现方式通常是两种一种是用原生Java/Kotlin写一个WebView壳把后台的客服工作台页面包进去另一种是用H5页面配合原生推送插件。老PHPlivechat修复版里带的APP更接近前一种所以你拿到压缩包后会看到类似android/或app/这样的独立目录里面是一个完整的Android工程。先用文件管理器打开APP目录确认有没有build.gradle和AndroidManifest.xml——有这两个文件就说明是标准Android工程。接下来最关键的一步是找到服务器地址配置。这个地址通常存在以下位置之一app/src/main/res/values/strings.xml、app/src/main/java/下的某个常量类或者assets/config.json。用一条命令在APP源码里搜索域名配置grep -rn http app/src/main/ --include*.xml --include*.java搜出来的URL就是APP连接后台的接口地址。把它改成你自己的域名但要注意一个坑如果服务器没配HTTPSAPP里面的地址要写http://你的域名并且Android 9.0以上的系统默认禁止明文HTTP流量你必须在AndroidManifest.xml里加一行声明才能正常请求。application android:usesCleartextTraffictrue ...4.2 打包与签名无Android Studio也能出一版能装的APK如果你电脑上没有装Android Studio只用命令行也可以出包。前提是安装了JDK和Android SDK命令行工具。进入APP工程目录后执行gradle assembleDebugassembleDebug会生成一个debug签名APK路径在app/build/outputs/apk/debug/app-debug.apk。这个APK可以直接安装但应用图标右下角会有一个“Debug”字样而且debug签名只能用于测试正式在手机上长期用建议做一次release签名。release签名需要先生成密钥库用JDK自带的keytool命令keytool -genkeypair -v -keystore livechat-release.keystore -alias livechat -keyalg RSA -keysize 2048 -validity 10000生成密钥库后在app/build.gradle里配置签名信息再执行gradle assembleRelease。签名这一步很多人忽略结果装到一半提示“应用未安装”其实就是debug签名和release签名不一致导致的。如果只是自己手机用持续用debug包也不会有大问题但如果要给公司客服统一配发一定要走release签名流程。安装好APP后打开会看到一个登录页输入后台客服账号密码就能进入工作台。工作台显示会话列表、消息内容、访客信息这几个核心模块回复消息和电脑端操作逻辑一致。4.3 掉线与推送失败APP端特有的三个排查点APP端最常见的痛点就是“收不到消息”和“用一段时间就掉线”。原因和解决路径如下第一个原因是APP的会话保持依赖WebSocket或AJAX轮询而手机熄屏后系统会冻结后台进程。常见做法是在APP设置里加入“前台服务”或“唤醒锁”机制。如果你没有改代码的打算至少在测试阶段保持APP在前台运行不要切到后台太久。第二个原因是服务器防火墙或安全组没有放行WebSocket端口。PHPlivechat的实时消息如果走的是ws://协议默认端口是8080或843而很多云服务器安全组默认只开放80和443。表现为APP能登录、能拉取历史会话但新消息来了不推。排查命令netstat -tlnp | grep 8080如果看到node或php进程在监听8080端口说明服务没问题问题出在安全组或防火墙规则去云控制台把对应端口的入站规则加一下。第三个原因是服务器时间与手机时间差太多。老程序的会话存在带时间戳的加密串客户端和服务器时间偏差超过一定阈值会被判定为非法请求。把服务器时间用NTP校准ntpdate ntp.aliyun.com校准后重启一下PHP-FPM。这个坑很隐蔽症状就是“APP能用但消息永远发不出去”不检查时间根本想不到。5. PHPlivechat避坑清单从白屏到会话丢失的5个真实踩坑记录5.1 安装后页面全白扩展缺失与错误提示被关掉现象打开后台地址页面一片空白浏览器控制台看不到任何报错服务器日志也没记录。原因绝大多数情况是PHP扩展缺失其次是框架错误日志没开导致致命错误被吞掉。PHPlivechat依赖pdo_mysql和mbstring少了任何一个框架初始化就会中断但又没有输出错误信息的能力。解决先看PHP错误日志日志路径在宝塔的“软件商店 → PHP设置 → 配置文件”里找error_log配置项。如果日志文件里是空的临时开启错误显示ini_set(display_errors, 1); error_reporting(E_ALL);然后把这段写到入口文件web/index.php的最上方刷新页面就能看到具体报错。看到Call to undefined function mb_strlen()就把mbstring扩展装回来看到could not find driver就检查pdo_mysql。5.2 客服登录后看不到访客会话表时间字段与服务器时区现象客服账号正常登录但访客发消息时后台不出现新会话刷新页面后会话才推进来。原因PHPlivechat的会话列表查询条件是“最近活跃时间大于当前时间减去N秒”如果服务器时区设置成UTC而数据库存的是北京时间时间一对比就差了8个小时新会话会被当成“很久以前的会话”过滤掉。解决把PHP和MySQL的时区都设为Asia/Shanghai。PHP侧在php.ini里改date.timezone Asia/ShanghaiMySQL侧执行mysql -uroot -p -e SET GLOBAL time_zone 08:00;改完重启PHP-FPM和MySQL。这个坑最烦人的地方在于它“能用但不好用”——消息能收到但要刷新才出现极大的误导性。5.3 网页端聊着聊着变“发送失败”session锁定与轮询冲突现象访客和客服对话正常进行过几分钟后访客发送的消息一直转圈最后提示发送失败刷新页面又恢复正常。原因PHPlivechat的网页端采用AJAX轮询方式获取新消息。PHP默认的session机制会在一个请求未结束前锁住session文件如果两个轮询请求同时到达后一个请求要等前一个释放锁等待时间超过浏览器超时就会报失败。老代码在长轮询模式下尤其明显。解决把session的存储方式从文件改成Redis或者缩短PHP的max_execution_time避免单个请求长时间占用session。最简单见效快的做法是在数据库配置里增加一行设置关闭session锁session array( class CDbHttpSession, connectionID db, autoStart true, ),这是经典Yii配置把session存到数据库表里去不再锁文件。前提是数据库里要有对应的session表源码包的SQL文件里一般自带。5.4 数据库UTF-8乱码建库字符集与连接字符集要一致现象管理后台显示的中文全部是问号或乱码但数据库里直接查询却是正常中文。原因建库时用了utf8mb4但PHP连接数据库时指定的是utf8两边字符集不一致导致数据读取时编码转换出错。或者反过来库是utf8连接指定了gbk。解决统一设置连接字符集在配置文件的charset项里改成和建库字符集一致。如果你确定数据库是utf8mb4把配置改成charset utf8mb4,改完清一下浏览器缓存再刷新页面。这里还要注意一点数据库里现有数据的乱码是不可逆的如果导入前就已经乱码只能重新导入一次SQL所以导入时一定要确认库字符集。5.5 修复版替换后原数据没了备份表结构与增量数据分离现象把网站上原来的老版本替换成这个修复版后登录后台发现所有历史会话和客服账号都没了。原因安装时覆盖了数据库。很多“修复版”的SQL文件是全新安装脚本导入它会清空已有的表数据。你以为是在升级实际上等于重装。解决替换文件之前先把原数据库完整备份这个习惯应该养成。备份命令mysqldump -uroot -p livechat livechat_backup_$(date %Y%m%d).sql然后对比新旧SQL文件里的表结构差异用diff命令看两个文件有没有新增字段或表diff old_database.sql new_database.sql如果差异只在个别表就手动把新字段补到旧库里而不是直接导入整套新SQL。我一般会把老库备份放一边先全新安装修复版确认没问题再把老数据通过SQL脚本迁移过去。别嫌麻烦数据丢了没有后悔药。6. 把PHPlivechat收进自己的项目二次开发前必做的三件事6.1 把客服按钮做成网站全局插件嵌入代码与变量注入如果你的网站是WordPress或ThinkPHP这样的框架把PHPlivechat的嵌入代码直接复制到主题页脚可行但每次换主题又得重来一遍。我习惯把嵌入代码封装成一个独立JS文件放到CDN上然后在所有页面统一加载。关键在于注入用户信息作为访客标识window.phpLiveChatConfig { serverUrl: https://chat.yourdomain.com, visitorName: window.currentUserName || , visitorEmail: window.currentUserEmail || , groupId: window.currentUserGroup || 0, customFields: { 用户ID: window.currentUserId || 0 } };这样访客发起咨询时客服后台能直接看到登录用户的名字和ID而不是一串随机字符串处理售后时不用每次都问“您账号是什么”。这个改动只涉及前台JS不动PHP核心代码升级修复版时不会被覆盖。6.2 用数据库钩子把聊天记录同步到业务库客服系统的价值不止在于聊天更在于聊天记录能关联到订单和用户。PHPlivechat的消息表是message里面存了会话ID和消息内容但没有订单ID的概念。要打通业务数据常见做法是写一个Shell定时任务把新产生的聊天记录同步到自己的业务库。*/5 * * * * mysql -uroot -p密码 livechat -e INSERT IGNORE INTO business_chat_log (chat_id, visitor_id, content, created_at) SELECT m.chat_id, m.sender_id, m.body, m.created_at FROM message m WHERE m.created_at DATE_SUB(NOW(), INTERVAL 10 MINUTE);INSERT IGNORE的语义是如果记录已存在就跳过避免重复插入。同步表结构比同步数据更重要建议先建一张和message结构一致的business_chat_log表再加一个order_id字段方便后续关联业务订单。定时任务每5分钟跑一次实时性足够又不会给数据库太大压力。6.3 上线前的性能与安全验证最后一个建议是上线前把这两件事做掉一是给站点配上HTTPSAPP端和网页端的WebSocket连接建议全部走WSS加密传输否则访客聊天内容在公网是明文传输的这在小网站可能无所谓但涉及用户手机号、订单信息时就是事故。配HTTPS在宝塔里是免费SSL证书一键申请的事而WSS需要在Nginx配置里加一条WebSocket反向代理规则。二是压测一下并发会话场景。PHPlivechat的本质是PHP应用一个PHP-FPM进程同时处理一个请求并发能力取决于服务器配置。没有压测工具就用简单的ab命令模拟100个并发请求ab -n 1000 -c 100 -H Accept-Encoding: gzip,deflate https://你的域名/index.php?rsite/login观察Failed requests和Requests per second两项指标。如果失败率超过1%考虑把PHP-FPM的pm.max_children调大或者上Redis缓存session。这个验证做完系统才算真正能接客。说回我的个人习惯每次拿到这种修复版源码第一步永远是看数据库结构和配置文件而不是直接装上去。搞清楚它改了什么、动过哪里后面维护才不会两眼一抹黑。这套PHPlivechat方案的维护成本极低跑起来放那儿半年不管都没关系但该留的备份一个都不能少。希望帮到你。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门