Workerman WebSocket 连接被拒绝因默认绑定 127.0.0.1,需改为 0.0.0.0 并放行端口、配置 Nginx 透传 Upgrade/Connection 头、广播前检查 isConnected()、主动心跳维护连接有效性。

Workerman 启动后 WebSocket 连接被拒绝(ECONNREFUSED)
默认不监听 0.0.0.0,只绑定了 127.0.0.1,浏览器从其他设备或域名访问时必然失败。
- 改
$ws_worker->listen('websocket://0.0.0.0:2346');,别留127.0.0.1 - 确认防火墙放行端口(
2346或你选的端口),云服务器还要检查安全组 - 如果用 Nginx 反代,必须透传
Upgrade和Connection头,否则握手直接 400
onMessage 收不到前端发来的消息
常见原因是前端没走标准 WebSocket 协议握手,或服务端误用了 text/binary 类型判断逻辑。
- 前端用
new WebSocket('ws://your-domain:2346'),别漏ws://,HTTPS 环境用wss:// - Workerman 的
$connection->send()只接受字符串或WebSocket\Frame对象,别直接 send 数组 - 调试时在
onMessage开头加var_dump($data);,确认是否进来了——很多问题其实是前端根本没连上,不是没触发
广播消息时部分客户端收不到($connection->send() 失效)
Workerman 不自动维护连接有效性,掉线连接仍留在 $worker->connections 里,foreach 广播时会卡在已断开的 socket 上。
- 务必在广播前检查
if ($connection->isConnected()) - 不要依赖
onClose清理数组——它可能不触发(如网络闪断),得靠心跳检测 + 超时踢出 - 简单心跳可设
$connection->ping();每 30 秒一次,配合$connection->lastPingTime判断超时
Nginx 反代 WebSocket 后 Connection: upgrade 被吃掉
这是最隐蔽的坑:Nginx 默认不透传协议升级头,导致握手失败,浏览器报 Unexpected response code: 200。
- 反代配置里必须显式加这三行:
proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade"; - 别写成
Connection "keep-alive",也别漏$http_upgrade变量 - 配完记得
nginx -t && nginx -s reload,改了配置不重载等于没改
Workerman 的 WebSocket 实现轻量,但对网络细节敏感。真正卡住的往往不是编码逻辑,而是地址绑定、头透传、连接状态管理这些“看不见”的环节。多看 netstat -an | grep :2346 和浏览器 Network 面板里的 WebSocket 握手请求,比翻文档更快定位问题。









