绝大多数不是框架问题,而是握手失败或中间链路拦截所致:需验证101响应及upgrade/connection头、nginx透传配置(proxy_http_version 1.1、$http_upgrade、"upgrade"、proxy_read_timeout≥心跳×2)、swoole启用websocket协议并正确绑定事件、ssl证书完整,以及onopen中无鉴权拦截。

ThinkPHP6.0 配置 WebSocket 服务后连接断开,**绝大多数不是框架本身问题,而是握手失败或中间链路拦截所致**。TP6 自带的 Swoole 支持仅提供基础封装,实际连接稳定性高度依赖底层 Swoole 配置、反向代理(如 Nginx)、SSL 终止及心跳机制协同。排查需从协议建立起点切入,而非直接调大重连次数。
检查 WebSocket 握手是否真正完成
打开浏览器 DevTools → Network → 切换到 WS 标签,点击连接项查看响应:
- 状态码必须是 HTTP/1.1 101 Switching Protocols;若为 200、403、502,说明未进入 WebSocket 协议栈
- 响应头必须同时包含 Upgrade: websocket 和 Connection: Upgrade
- 确认请求头含 Sec-WebSocket-Key,且服务端返回的 Sec-WebSocket-Accept 值可被校验(客户端 Key + 固定字符串 SHA-1)
验证 Nginx 是否正确透传升级请求
ThinkPHP6 通常部署在 Nginx 后,而 Nginx 默认不识别 WebSocket 升级,必须显式配置(漏一项即秒断):
- proxy_http_version 1.1 —— HTTP/1.0 不支持 Upgrade
-
proxy_set_header Upgrade $http_upgrade —— 注意变量名是
$http_upgrade,不是$upgrade -
proxy_set_header Connection "upgrade" —— 双引号不可省,值必须是字面量
"upgrade" - proxy_read_timeout 3600 —— 必须 ≥ 心跳间隔 × 2;设为 60 是“连上即断”的最常见原因
确认 Swoole 服务端监听与路由配置无误
ThinkPHP6 使用 Swoole 时,需确保:
- Swoole Server 实例启用了
websocket协议(非 http 或 tcp),例如:new Swoole\WebSocket\Server($host, $port) - 已正确绑定
onOpen、onMessage、onClose事件,且onOpen中无阻塞逻辑或异常抛出 - 若启用 SSL(wss),Swoole 配置中需设置
ssl_cert_file和ssl_key_file,且证书链完整 - 检查 TP6 的
config/websocket.php中enable为 true,且host/port与启动命令一致
排查服务端主动拒绝或鉴权拦截
即使握手成功,Swoole 层也可能在 onOpen 中校验失败并立即关闭连接:
- 检查日志中是否有
origin mismatch、token invalid、ip banned等关键词 - 临时注释掉
onOpen中所有鉴权逻辑,用 curl 模拟握手测试:curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" http://your-domain.com/ws - 确认 Origin 头是否被 TP6 中间件(如跨域配置)自动拦截;若前端页面域名与 WebSocket 地址不完全一致(如 www vs 无 www、http vs https),浏览器会静默拒绝
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











