必须用workerman搭建websocket服务端实现实时聊天,需php 8.0+及pcntl、posix扩展,通过composer安装,编写chat.php监听2345端口,设置4进程并在onmessage中正确遍历connections广播消息,启动后可用js websocket测试连通性。

要让网页用户之间能即时收发文字消息、不刷新页面就能看到对方回复,必须用Workerman搭建一个持续运行的WebSocket服务端,它负责接收、中转和广播每一条聊天内容。
环境准备与基础依赖安装
确认服务器已安装PHP 8.0及以上版本,并启用pcntl和posix扩展——这两个扩展是Workerman多进程与信号处理的【硬性前提】,缺一不可。
执行命令安装Workerman主库:composer require workerman/workerman。这会把核心类库下载到vendor/目录下,后续所有代码都基于此加载。
编写最简WebSocket聊天服务
新建chat.php文件,粘贴以下代码:
第一步:引入自动加载器并声明命名空间
第二步:创建监听websocket://0.0.0.0:2345的Worker实例
第三步:设置进程数为4,匹配常见CPU核心数
第四步:在onMessage回调中遍历$connection->worker->connections,对每个连接调用send($data)
注意:不要直接用foreach($ws_worker->connections as $conn),因为$ws_worker作用域不对;必须通过$connection->worker访问当前Worker实例的连接池,否则广播会失效。
启动服务并验证连通性
终端执行:php chat.php start。看到输出Workerman[chat.php] start in daemon mode即表示后台运行成功。
打开浏览器开发者工具Console,输入以下JS代码连接测试:
const ws = new WebSocket('ws://localhost:2345'); ws.onopen = () => ws.send('hello'); ws.onmessage = e => console.log(e.data);
若收到回显或被其他客户端收到该消息,说明服务已正常工作。
添加用户身份与房间隔离(可选进阶)
方法一:为每个连接分配唯一uid,存入$worker->uidConnections[$uid] = $connection,后续按uid精准推送。
方法二:用数组维护房间映射,如$worker->rooms['room1'] = [$conn1, $conn2],发送时只遍历对应房间连接。
方法三:借助Redis存储在线状态和离线消息,避免Worker进程重启后数据丢失——此时需在onConnect中写入Redis,在onClose中清理键值。











