在企业数字化转型中,越来越多的团队选择私有化部署在线客服系统。相比按坐席收费的 SaaS 平台,拥有一套可二开的「在线客服系统源码」,不仅能把客户聊天记录完全掌握在自己手里,还能根据业务灵活接 AI 机器人、CRM 或工单系统。
本文将面向后端开发者和运维人员,手把手教你在一台干净的 CentOS 服务器上,从零部署一套基于 Workerman 的高性能 PHP 在线客服系统源码。内容覆盖环境选型、PHP 扩展编译、Workerman 常驻进程配置、Nginx 反向代理以及生产级守护方案,照着做基本可以一次跑通。
源码:zxkfym.top
传统的 PHP 客服系统往往用 Ajax 轮询,客户端每隔几秒请求一次服务器,不仅延迟高,还会把服务器 CPU 打满。
而主流的 PHP 在线客服系统源码现在几乎都基于 Workerman(或 Swoole)实现 WebSocket 长连接:

这也是为什么你在找源码时,看到 Workerman、GatewayWorker 这两个词,基本可以判断这套代码架构是比较新的。

1. 服务器规格建议
项目 | 最低配置 | 生产推荐 |
|---|---|---|
CPU | 1 核 | 2 核及以上 |
内存 | 2 GB | 4 GB+ |
系统 | CentOS 7.x | CentOS 7.x / Rocky Linux 8 |
硬盘 | 40 GB | SSD 50 GB+ |
⚠️ 注意:Workerman 在 Windows 下仅支持调试,生产环境必须用 Linux。本文以 CentOS 7.9 为例。
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0客服系统通常需要两个端口:
80/443:访客网页访问
8282(或自定义):WebSocket 服务端口
firewall-cmd --zone=public --add-port=8282/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload如果你用的是阿里云/腾讯云,记得去安全组再放行一次 8282,很多新手卡在这一步。

CentOS 自带 YUM 里的 PHP 是 5.4,太老,直接淘汰。
yum install -y epel-release
yum install -y https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm启用 PHP 8.1(Workerman 官方推荐 8.0+):
yum-config-manager --enable remi-php81yum install -y php php-cli php-fpm php-mysqlnd \
php-pcntl php-posix php-sockets php-redis \
php-gd php-mbstring php-json php-zip unzip wget git检查版本:
php -v
# 应显示 PHP 8.1.x默认的 stream select 在高并发下性能较差,必须装 event:
yum install -y php-pear php-devel gcc make
pecl install event安装完成后,在 php.ini 中加入:
extension=event.so确认扩展加载成功:
php -m | grep event
假设你拿到的源码是基于 ThinkPHP + GatewayWorker 的经典结构(市面 90% 商业源码都是这种)。
cd /www/wwwroot
git clone https://gitee.com/your_repo/customer-service.git
# 如果是压缩包
# unzip customer_service.zip
mv customer_service kefu
chown -R www:www kefu
chmod -R 755 kefukefu/
├── app/ # 管理后台接口
├── public/ # Web 访客端入口(静态页)
├── vendor/ # Composer 依赖
├── gateway/ # GatewayWorker 服务端
│ ├── start.php # Workerman 启动入口
│ └── Applications/
│ └── Chat/ # 业务逻辑(消息分发、客服分配)
├── .env # 数据库配置yum install -y mariadb mariadb-server
systemctl start mariadb
mysql_secure_installation创建数据库:
CREATE DATABASE kefu CHARACTER SET utf8mb4;
CREATE USER 'kefu_user'@'localhost' IDENTIFIED BY 'StrongPassword123';
GRANT ALL ON kefu.* TO 'kefu_user'@'localhost';
FLUSH PRIVILEGES;导入源码自带的 SQL 文件(一般在 /doc/install.sql):
mysql kefu < /www/wwwroot/kefu/doc/install.sqlyum install -y redis
systemctl start redis编辑 .env 或 config/database.php:
return [
'default' => [
'host' => '127.0.0.1',
'database' => 'kefu',
'username' => 'kefu_user',
'password' => 'StrongPassword123',
'charset' => 'utf8mb4',
]
];编辑 GatewayWorker 的 config.php,这是 WebSocket 服务的核心:
$gateway = new Gateway("Websocket://0.0.0.0:8282");
// 内部通讯端口
$register = new Register('text://0.0.0.0:1238');
// 心跳设置(防止云服务器断连)
$gateway->pingInterval = 55;
$gateway->pingData = '{"type":"ping"}';
进入 Gateway 目录:
cd /www/wwwroot/kefu/gateway
php start.php start看到类似输出表示成功:
Workerman[start.php] start in DEBUG mode
GatewayWorker version: 3.0.x
Websocket server started on 0.0.0.0:8282
Register server started on ...调试阶段用 start,上线一定要用 -d 守护进程:
php start.php stop
php start.php start -d查看状态:
php start.php status不要用 nohup,正规做法是用 systemd。
新建服务文件:
vim /etc/systemd/system/kefu-workerman.service写入以下内容:
[Unit]
Description=Kefu Workerman Service
After=network.target mysql.service
[Service]
Type=simple
User=www
Group=www
WorkingDirectory=/www/wwwroot/kefu/gateway
ExecStart=/usr/bin/php /www/wwwroot/kefu/gateway/start.php start -d
ExecStop=/usr/bin/php /www/wwwroot/kefu/gateway/start.php stop
Restart=always
[Install]
WantedBy=multi-user.target启动并设置开机自启:
systemctl daemon-reload
systemctl start kefu-workerman
systemctl enable kefu-workerman访客不希望连接 wss://ip:8282,我们统一走 443 端口。
server {
listen 443 ssl;
server_name kefu.yoursite.com;
ssl_certificate /ssl/yoursite.pem;
ssl_certificate_key /ssl/yoursite.key;
root /www/wwwroot/kefu/public;
index index.html index.php;
# PHP 后台接口
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
# WebSocket 代理
location /ws/ {
proxy_pass http://127.0.0.1:8282;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400;
}
}前端 JS 连接地址改为:
var ws = new WebSocket('wss://kefu.yoursite.com/ws/');如果你用宝塔,步骤基本一致,但有 3 个坑:
pcntl、posix、event、redis。
php.ini 中的 shell_exec、proc_open 禁用,否则 Workerman 启动会报错。
wss 还是 ws:HTTP 页面只能连 ws,HTTPS 只能连 wss。
telnet 127.0.0.1 8282 看服务是否监听。
一般是数据库表字符集问题,确保 messages 表是 utf8mb4。
没装 event 扩展,或者 ulimit 太小,执行:
ulimit -n 65535并在 /etc/security/limits.conf 中永久修改。
Workerman 自带压测工具,简单测试:
php start.php status生产环境建议:
拿到这套 在线客服系统源码 后,你可以很方便地扩展:
Chat/Events.php 的 onMessage 里,判断用户消息,调用 OpenAI / DeepSeek API,自动回复。
group_id 隔离不同商户的数据。
至此,你已经完成了从零部署 PHP 在线客服系统源码的全部流程。核心记住三点:
如果你在部署过程中遇到具体的报错日志,可以把 start.php status 的输出贴出来,通常 90% 的问题都在端口或 PHP 扩展上。
私有化客服系统的好处在于“可控”,后续无论是加排队机、满意度评价,还是 AI 自动接待,都只需要改这一份源码——这才是企业级部署的真正价值。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。