php本身不原生支持websocket服务器,需借助workerman等常驻框架实现;其核心是启动监听服务、处理onconnect/onmessage事件、广播或定向推送消息,并配合前端websocket api完成实时通信。

PHP本身不原生支持WebSocket服务器,但可以通过第三方扩展或框架实现WebSocket实时消息推送。核心思路是:用PHP启动一个常驻的WebSocket服务端,监听客户端连接,接收和广播消息;前端通过JavaScript的WebSocket API建立连接并收发数据。
使用Workerman搭建WebSocket服务
Workerman是最常用的PHP WebSocket解决方案,轻量、高性能、无需额外扩展。
- 安装:通过Composer引入
workerman/workerman - 创建服务端脚本(如
websocket_server.php):$ws_worker = new Worker("websocket://0.0.0.0:2345");<br> $ws_worker->onMessage = function($connection, $data) {<br> $connection->send("收到:".$data); // 单播<br> foreach($ws_worker->connections as $conn) {<br> $conn->send("广播:".$data); // 广播<br> }<br> };<br> Worker::runAll(); - 启动服务:
php websocket_server.php start(开发环境可用start -d守护进程模式)
配合前端建立WebSocket连接
浏览器端用标准WebSocket API连接PHP服务端,注意协议为ws://(开发)或wss://(生产)。
- 初始化连接:
const ws = new WebSocket("ws://your-domain.com:2345"); - 监听事件:
ws.onopen、ws.onmessage、ws.onerror、ws.onclose - 发送消息:
ws.send("Hello from browser") - 服务端返回的消息会触发
ws.onmessage,可直接更新页面内容或触发通知
处理用户身份与消息路由
真实场景需区分用户、房间或私聊,不能简单广播。
- 客户端连接时,可携带token或用户ID(如URL参数:
ws://.../2345?uid=1001),服务端在onConnect中解析并绑定 - 将连接存入全局数组或Redis:
$connections[$uid] = $connection;,便于定向推送 - 按房间管理:用
Room类维护用户列表,加入/退出房间、向房间内所有人广播 - 避免内存泄漏:连接关闭时及时unset对应连接对象
生产环境注意事项
Workerman适合中小规模实时应用,但上线前需关注稳定性与安全性。
- 反向代理:Nginx需配置WebSocket升级头(
Upgrade和Connection),否则握手失败 - 心跳保活:客户端和服务端定期互发ping/pong,防止连接被中间设备断开
- SSL支持:如需wss,可通过Nginx终止SSL,后端仍用ws;或让Workerman直接加载证书(需启用openssl扩展)
- 集群扩展:单机性能有限,多实例间消息同步需借助Redis Pub/Sub或消息队列
不复杂但容易忽略细节,关键是选对工具、理清连接生命周期、做好状态管理。Workerman + 前端WebSocket API组合,已足够支撑聊天、通知、协同编辑等常见实时场景。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











