讲师中心 微信公众号
AI工具推荐 视频效率加速

Workerman WebSocket怎么获取GET参数

大墨同学_6229

大墨同学_6229

发布时间:2026-09-02 10:35:59

|

331人浏览过

|

来源于php中文网

原创

WebSocket连接建立时的GET参数只能在onConnect回调中通过解析$connection->context->websocket->handshake['requestLine']获取,因WebSocket协议不创建Http\Request实例,$request->get()无效;需用parse_url和parse_str提取并存至$connection属性供后续使用。

workerman websocket怎么获取get参数

WebSocket 连接建立时的 GET 参数,只能在 onConnect 回调里拿到,且必须从 $connection->getRemoteIp() 之外的源头解析——它藏在 $connection->context->host 或更准确地说,是 $connection->context->websocket->handshake 的原始请求头里。

为什么 $request->get() 在 WebSocket 里完全无效

Workerman 的 WebSocket 协议处理器(Workerman\Protocols\Websocket)不构造 Request 对象,也不触发 HTTP 协议层的参数解析逻辑。$request->get() 是 HTTP 协议专用方法,只存在于 Workerman\Protocols\Http\Request 实例中。WebSocket 连接握手阶段虽用的是 HTTP Upgrade 请求,但 Workerman 不会把它升级为一个可调用 get()Request 实例。

常见错误现象:
onMessage 里写 $request->get('token') → 报错 Undefined variable: $request
或误以为 $connectionget() 方法 → 调用失败,返回 null 或致命错误。

  • WebSocket 连接对象 $connectionWorkerman\Connection\TcpConnection 实例,不是 Request
  • onMessage 收到的是纯消息体(字符串或二进制),没有 URL 查询参数上下文
  • GET 参数只存在于 TCP 握手那一刻的 HTTP 请求行和头中,之后就丢了

onConnect 中手动解析 handshake 原始数据

Workerman 会在 WebSocket 握手完成后,把原始 HTTP 请求头存入 $connection->context->websocket->handshake(类型为 array),其中 requestLine 字段包含完整的请求行,例如:GET /ws?token=abc123&uid=456 HTTP/1.1

实操建议:

WebSocket 8.18.2
WebSocket 8.18.2

WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。

下载
  • 只在 onConnect 回调里处理,错过就永远拿不到
  • parse_url() + parse_str() 安全提取,别直接正则匹配 requestLine
  • 注意:$connection->context 可能为 null,需先判空
  • 示例代码片段:
use Workerman\Worker;
$ws_worker = new Worker('websocket://0.0.0.0:2346');
$ws_worker->onConnect = function ($connection) {
    if (isset($connection->context->websocket->handshake['requestLine'])) {
        $line = $connection->context->websocket->handshake['requestLine'];
        $url = parse_url($line);
        if (isset($url['query'])) {
            parse_str($url['query'], $query);
            $token = $query['token'] ?? null;
            $uid   = (int)($query['uid'] ?? 0);
            // 存到连接上下文中,供 onMessage 后续使用
            $connection->token = $token;
            $connection->uid   = $uid;
        }
    }
};

如何在 onMessage 里安全复用这些参数

不能重新解析 handshake(它只在 onConnect 时存在),必须提前存到 $connection 实例属性上。这是唯一可靠方式。

  • 存的时候不校验 token 有效性?可以,但建议在 onConnect 就做基础校验(如非空、长度、格式),避免无效连接占资源
  • 如果 token 需要 Redis 校验或 DB 查询,不要在 onConnect 里同步执行——会阻塞整个进程;应改用异步方式(如 Worker::sendToWorkerProcess() 或协程 client)
  • 注意:多进程模式下,$connection 属性只在本进程有效;跨进程广播时,需通过 GatewayWorker 的 Events 或 Channel 传递 uid/token
  • 别把敏感参数(如 token)直接 echo 给前端,或记录到日志明文字段中

用 Nginx 代理时 GET 参数会不会丢失

会,如果 Nginx 配置没透传原始请求路径。默认 proxy_pass 会重写 URI,丢掉 query string。

必须显式配置:

location /ws {
    proxy_pass http://127.0.0.1:2346;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    # 关键:保留原始 URI,包括 ? 后面的部分
    proxy_redirect off;
    proxy_set_header Host $host;
}

否则浏览器连 wss://example.com/ws?token=xxx,后端收到的 requestLine 可能变成 GET / HTTP/1.1,参数彻底消失。

真正容易被忽略的点是:即使你写了 proxy_pass http://127.0.0.1:2346/(结尾带斜杠),Nginx 也会 strip 掉原始 query —— 必须去掉末尾斜杠,或用 rewrite 显式携带 $args

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
Golang WebSocket与实时通信开发
Golang WebSocket与实时通信开发

本专题系统讲解 Golang 在 WebSocket 开发中的应用,涵盖 WebSocket 协议、连接管理、消息推送、心跳机制、群聊功能与广播系统的实现。通过构建实际的聊天应用或实时数据推送系统,帮助开发者掌握 如何使用 Golang 构建高效、可靠的实时通信系统,提高并发处理与系统的可扩展性。

175

2025.12.22

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

376

2026.01.19

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

375

2026.03.18

WebSocket 前端开发与实战技巧
WebSocket 前端开发与实战技巧

聚焦 WebSocket 在前端项目中的工程化实践,涵盖原生 JavaScript WebSocket 连接的封装与状态管理、Vue 3 中 WebSocket 的 Composable 封装(useWebSocket)、React 中自定义 Hook 管理连接生命周期、心跳检测(Ping/Pong 定时器)与自动断线重连的实现策略、指数退避重连算法、消息序列化协议(JSON / Protobuf / MessagePack)的选型与性

348

2026.05.25

WebSocket发送和接收数据教程合集
WebSocket发送和接收数据教程合集

本专题整合了WebSocket发送与接收数据教程合集,阅读专题下面的文章了解更多详细内容。

281

2026.05.25

Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

146

2026.05.20

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

182

2026.05.20

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

127

2026.05.20

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

0

2026.09.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn