WebSocket连上即断基本是握手失败,需检查Network中是否返回101状态码及Upgrade、Connection响应头,重点排查Nginx是否漏配proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade"和proxy_read_timeout≥3600。

PHP 8.5.5 本身不会导致 WebSocket 断开——它只是个维护版本,不改动底层网络行为或引入破坏性变更。断开问题 100% 出在运行时环境、配置或代码逻辑上,和 PHP 版本号无关。
WebSocket 连接闪断:先看 Network 里有没有 101
连上即断,大概率握手失败,根本没进通信阶段:
- 打开浏览器 DevTools → Network → Filter
WS→ 点击那个刚断开的连接项 - 检查 Response Headers 是否同时包含:
Upgrade: websocket和Connection: Upgrade - 确认状态行是
HTTP/1.1 101 Switching Protocols,不是200 OK、400 Bad Request或空白 - 如果看到
502 Bad Gateway或压根没响应头,说明 Nginx / Apache 拦截了 Upgrade 请求,或者 PHP 进程根本没收到请求(比如用 FPM 启动了 WebSocket 服务)
Nginx 配置漏项:proxy_set_header Upgrade $http_upgrade 是高频错
PHP WebSocket 服务(如 Swoole、Ratchet)常被 Nginx 反代,但 Nginx 默认不透传 Upgrade 头:
-
proxy_http_version 1.1必须显式写,HTTP/1.0 不支持协议升级 -
proxy_set_header Upgrade $http_upgrade—— 注意变量名是$http_upgrade,不是$upgrade(拼错就失效) -
proxy_set_header Connection "upgrade"—— 双引号不能丢,值必须是字面量"upgrade" -
proxy_read_timeout 86400要设在location块内,不是http或server级;只改这一个不够,还得同步设proxy_send_timeout和keepalive_timeout
PHP 进程模式错误:FPM 无法处理 WebSocket 握手
用 php-fpm 运行 WebSocket 服务,等于让快递员去开飞机——协议根本不支持:
立即学习“PHP免费学习笔记(深入)”;
- FPM 是为短生命周期 HTTP 请求设计的,收到
Upgrade: websocket请求会直接返回400 Bad Request或静默丢弃 - 必须用 CLI 模式启动独立进程,且依赖事件循环扩展:Swoole、ReactPHP、Workerman 或 Ratchet(基于 ReactPHP)
- Ratchet 的
IoServer::factory()三层包装不可省略:IoServer绑端口、HttpServer处理握手、WsServer解帧,漏一层就起不来 - 本地测试时,确保 URL 协议、域名、端口与页面完全同源:
https://页面不能连ws://,localhost和127.0.0.1被视为不同源
真正卡住人的地方,往往不是 PHP 版本,而是 Nginx 少配了一个双引号,或是把 $http_upgrade 写成了 $upgrade——这种错不会报语法错误,只让连接在 101 前就静默死亡。



















