需配置WebSocket服务器(如Ratchet)、设计MySQL消息与会话表、实现前后端连接逻辑、编写服务端消息路由与数据库写入、建立客服分配与会话绑定机制。

如果您正在部署一个PHP项目中的即时通讯功能,需要通过WebSocket与MySQL协同工作来构建在线客服系统,则可能面临连接建立、消息持久化及实时推送等技术环节的配置问题。以下是实现该系统的具体步骤:
一、配置WebSocket服务器环境
WebSocket通信需独立于PHP HTTP服务运行,通常借助Ratchet、Swoole或Workerman等PHP扩展实现长连接管理。选择轻量级方案可避免Apache/Nginx对WebSocket握手的干扰。
1、安装Composer依赖:执行composer require cboden/ratchet引入Ratchet库。
2、创建WebSocket服务器脚本server.php,使用Ratchet\App实例监听端口,例如0.0.0.0:8080。
立即学习“PHP免费学习笔记(深入)”;
3、在Linux服务器上以守护进程方式启动:执行php server.php &,并确保防火墙放行对应端口。
二、设计MySQL消息与会话表结构
为支持消息追溯、客服分配与用户状态跟踪,需在MySQL中建立标准化数据表,确保每条消息可关联用户ID、客服ID、会话ID及时间戳。
1、执行SQL创建message表:CREATE TABLE message (id INT AUTO_INCREMENT PRIMARY KEY, session_id VARCHAR(64), sender_type ENUM('user','agent'), sender_id INT, content TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP);
2、执行SQL创建session表:CREATE TABLE session (id VARCHAR(64) PRIMARY KEY, user_id INT, agent_id INT NULL, status ENUM('open','closed') DEFAULT 'open', updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
3、为message表的session_id和created_at字段添加复合索引:CREATE INDEX idx_session_time ON message(session_id, created_at);
三、实现前端WebSocket客户端连接逻辑
浏览器端需通过原生WebSocket API连接后端服务,并处理onopen、onmessage、onerror等事件,确保连接稳定及消息格式兼容。
1、在客服页面初始化连接:const ws = new WebSocket("ws://your-domain.com:8080");
2、监听连接成功事件,在onopen回调中发送用户身份信息:ws.send(JSON.stringify({type: 'auth', role: 'agent', id: 123}));
3、在onmessage中解析JSON消息体,区分system、text、notify类型,并将text类消息插入DOM消息列表,同时调用scrollIntoView({behavior: 'smooth'})自动滚动到底部。
四、编写PHP服务端消息路由与数据库写入逻辑
WebSocket服务器需识别不同客户端角色(访客/客服),根据session_id分发消息,并在每次接收新消息时同步写入MySQL,保障离线可查。
1、在Ratchet的onMessage方法中解析JSON,提取session_id、sender_type、sender_id、content字段。
2、使用PDO预处理语句插入message表:$stmt = $pdo->prepare("INSERT INTO message (session_id, sender_type, sender_id, content) VALUES (?, ?, ?, ?)");
3、向当前session_id下所有已连接客户端广播消息(排除发送者自身),广播内容包含完整消息记录及发送时间:{"type":"message","data":{...}}。
五、实现客服端用户分配与会话绑定机制
当新访客发起咨询时,系统需自动分配空闲客服,并创建唯一session_id,确保后续消息按会话隔离,避免跨用户混淆。
1、访客首次连接时,服务端查询agent_id为NULL且status='open'的session记录,若无则执行INSERT INTO session (id, user_id, status) VALUES (UUID(), ?, 'open');
2、从MySQL中选取status='available'的客服记录,更新其状态为'busy'并绑定到该session:UPDATE agent SET status='busy', current_session='xxx' WHERE id=(SELECT id FROM agent WHERE status='available' LIMIT 1);
3、将绑定结果通过WebSocket单播通知客服端,携带session_id、user_name、user_avatar等上下文信息。



















