php中无webman websocket,所有可用实现均基于workerman;需用$worker->connections遍历广播、禁用opcache cli、反向代理透传upgrade头,并确保redis连接数充足。

Webman 不是 PHP 框架,用 PHP 写 Webman WebSocket 服务会直接失败。
你看到的「Webman + PHP」组合,基本都是混淆了 Workerman 和 Webman —— 这两个名字像、用途近,但技术栈完全不同:Workerman 是 PHP 生态里最主流的 WebSocket 实现框架;而 Webman 是 Java(早期资料误标为 C 或 PHP)或 Go 语言实现的轻量级服务器,与 PHP 无绑定关系。所有 PHP 项目中所谓「Webman WebSocket」,实际运行的必然是 Workerman。
下面直接说清楚怎么在 PHP 里真正跑起来 WebSocket 聊天室。
Workerman 的 onMessage 回调里不能直接广播给所有人
常见错误是写成:$connection->send($data) 只发回当前连接,看起来“回显”正常,但别人收不到。真正的广播必须遍历所有在线连接。
- 用全局数组
$clients存连接时,记得加static或闭包use (&$clients),否则子回调里访问不到 - 发送前务必检查连接是否还活着:
if ($client->isConnected()) { $client->send($msg); } - 别在
onMessage里做耗时操作(如查 DB、调 API),会阻塞整个 Worker 进程;要用异步客户端或投递到 Task 进程
多实例部署时,redis.max_connections 必须 ≥ 总 Worker 数 × 2
单机多 Worker 或多机器部署聊天室,靠 Redis 做跨进程/跨机器消息中转。如果只配了 redis.max_connections = 10,但你起了 8 个 Worker,每个 Worker 都要建立至少 2 个 Redis 连接(一个订阅、一个发布),立刻出现 Connection refused 或 Too many connections 错误。
- 检查方式:
redis-cli info clients | grep connected_clients - Workerman 中推荐用
Redis::pconnect()复用连接,但需注意连接超时和自动重连逻辑 - 若用
app/process/RedisSubscriberProcess.php做独立订阅进程,它本身也占 Redis 连接,要一并计入
websocket://0.0.0.0:8080 在生产环境必须反代,不能裸露端口
Nginx 或 Caddy 必须透传 Upgrade 和 Connection 头,否则握手失败,浏览器报错 WebSocket connection to 'ws://...' failed: Error during WebSocket handshake。
- Nginx 示例配置段里必须有:
proxy_http_version 1.1;、proxy_set_header Upgrade $http_upgrade;、proxy_set_header Connection "upgrade"; - HTTPS 下 URL 必须是
wss://,且 Nginx 要配置 SSL 证书;后端Worker仍用websocket://,协议升级由反向代理完成 - 别漏掉
proxy_buffering off;,否则消息可能被缓存延迟
关键点在于:PHP 场景下没有「Webman WebSocket」这回事,所有能跑通的代码,底层全是 Workerman。混淆名称会导致依赖装错、文档查偏、错误无法复现。真要上生产,优先确认 composer show | grep workerman 是否存在,而不是搜 “webman php websocket”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











