0

0

php连接websocket收不到返回_php连接websocket接收处理技巧【技巧】

看不見的法師

看不見的法師

发布时间:2026-02-01 21:05:19

|

279人浏览过

|

来源于php中文网

原创

PHP用fsockopen或stream_socket_client连WebSocket收不到返回,根本原因是未完成HTTP升级握手且未按RFC 6455解析帧;必须手动发送Upgrade请求、校验101响应、正确处理掩码与帧格式,并采用异步循环持续接收。

php连接websocket收不到返回_php连接websocket接收处理技巧【技巧】

PHP 用 fsockopenstream_socket_client 连 WebSocket 收不到返回?根本原因不是“连不上”,而是没完成 WebSocket 握手

WebSocket 协议不是裸 TCP,必须先完成 HTTP 升级握手(Upgrade: websocket),否则服务端直接关闭连接或静默丢包。PHP 原生不支持 WebSocket 协议fsockopenstream_socket_client 只能建 TCP 连接,发完握手请求后若不读取并校验响应头,就立刻发消息——服务端还没确认升级成功,自然不回任何数据。

实操建议:

  • 手动构造 GET /chat HTTP/1.1 请求,带 Upgrade: websocketConnection: UpgradeSec-WebSocket-Key(需 Base64 编码随机 16 字节)和 Sec-WebSocket-Version: 13
  • 发送后必须调用 fread()stream_get_contents() 读取完整响应,检查是否含 HTTP/1.1 101Upgrade: websocket,否则握手失败
  • 握手成功后,后续所有收发都需按 WebSocket 帧格式(RFC 6455)编码/解码:掩码、FIN、opcode、payload length 等,不能直接 fwrite($fp, "hello")

php-websocket-client 类库仍收不到消息?检查是否漏掉 receive() 轮询或事件循环

textalk/websocketratchet/pawl 这类客户端,底层仍是阻塞 I/O。如果你写成「connect → send → exit」,程序退出前没主动调用接收方法,消息就永远卡在 socket 缓冲区里。

常见错误现象:

立即学习PHP免费学习笔记(深入)”;

  • 服务端明明已发 pong 或业务消息,$client->receive() 返回 null 或空字符串
  • 使用 while ($msg = $client->receive()) { ... } 却卡死,因为默认 socket 是阻塞模式,没消息时会一直等

解决办法:

悦灵犀AI
悦灵犀AI

一个集AI绘画、问答、创作于一体的一站式AI工具平台

下载
  • 设 socket 为非阻塞:stream_set_blocking($this->socket, false)(若类库允许访问底层流)
  • 加超时控制:$client->receive(3)(单位秒),避免无限等待
  • 确保连接后至少调用一次 receive(),WebSocket 服务端常在握手后立即发 ping 或欢迎消息

收到数据却是乱码或解析失败?大概率是没处理 WebSocket 掩码(masking)

浏览器发给服务端的帧必须掩码,但服务端发给客户端的帧**不能掩码**。PHP 客户端若误将服务端响应当作需解掩码的数据处理,就会得到错位字节——表现为中文变问号、JSON 解析失败、二进制数据损坏。

关键判断点:

  • 检查帧头第 1 字节的第 9 位(mask flag):客户端接收时,该位应为 0;若为 1,说明对方违规,PHP 客户端应直接断连
  • ord($data[1]) & 0x80 提取 mask flag,再根据结果决定是否用第 2–5 字节做 XOR 解码
  • 别依赖简单 substr($data, 6) 截取消息体——payload length 可能为 126 或 127,需按 RFC 解析扩展长度字段

想稳定收消息,别自己封装,优先用 ratchet/pawl + ReactPHP 异步循环

同步阻塞模型在 WebSocket 场景下天然吃亏:一个连接卡住,整个脚本停摆。真正能持续收消息的 PHP 客户端,基本都基于 ReactPHP 的事件循环(LoopInterface)实现。

示例要点:

  • use Ratchet\Client\Connector; 初始化时传入 React\EventLoop\Factory::create()
  • 回调中处理 onMessage,而不是轮询:$conn->on('message', function($msg) { echo $msg; });
  • 必须显式调用 $loop->run() 启动事件循环,否则连接建立后立即退出,收不到任何后续帧
  • 注意内存泄漏:长期运行时,避免在闭包中引用大对象,或未 unset 回调句柄

真正难的不是“连上”,是维持连接状态、正确解析每一帧、及时响应 ping/pong、处理网络抖动重连——这些细节藏在协议深处,一不留神就收不到返回。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

422

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

537

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

237

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

499

2024.03.01

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

98

2023.09.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

361

2023.08.03

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号