Workerman onMessage收不到数据是什么原因

夏浩酱_4042

夏浩酱_4042

2026-08-08

904人浏览

原创

workerman onmessage收不到数据,首要确认客户端使用ws://协议、在onopen后send、服务端worker协议为websocket://;其次检查前端是否json.stringify发送、避免用postman等工具误测,排查onmessage是否被覆盖或缓冲区污染。

workerman onmessage收不到数据是什么原因

Workerman onMessage收不到数据,意味着客户端已成功建立连接,但服务端始终无法触发onMessage回调,常见于WebSocket或TCP长连接场景。这既不是网络不通,也不是进程未启动,而是数据在抵达onMessage之前就被拦截、丢弃或根本没进入正确处理流程。

客户端发的数据压根没走WebSocket协议

第一步:确认客户端连接的是ws://或wss://,而不是http://——浏览器用new WebSocket('http://xxx')会静默失败,控制台报错“Invalid URL”,但onConnect仍会触发,后续send无响应。

第二步:检查客户端是否在open事件后才调用send()。若在onopen前就send({msg:'hi'}),Workerman不会报错,但该消息会被内核丢弃,onMessage永不触发。

第三步:用Chrome开发者工具→Network→WS→Messages面板,看「Frames」里有没有Outgoing Message。没有发送记录,说明问题出在前端;有发送但右侧没Incoming,说明服务端没收到或没进onMessage。

服务端监听的不是WebSocket协议

检查$worker初始化时的协议类型:【必须是'websocket://'开头,不能写'tcp://'或'http://'】。写成$worker = new Worker('tcp://0.0.0.0:2345'),即使前端连ws://,Workerman也只当裸TCP处理,不会解WebSocket帧,$data永远为null。

方法一:改协议头
把'tcp://0.0.0.0:2345'换成'websocket://0.0.0.0:2345',并确保Workerman版本≥3.5.0(旧版不支持原生WebSocket)。

方法二:手动加载WebSocket协议类(兼容老版本)
require_once __DIR__ . '/Workerman/Protocols/WebSocket.php';
$worker = new Worker('tcp://0.0.0.0:2345');
$worker->protocol = \Workerman\Protocols\WebSocket::class;

客户端发的是原始字符串而非标准WebSocket帧

前端必须用WebSocket.send()发送UTF-8字符串,不能直接send({a:1})——这会触发TypeError且消息被浏览器丢弃。正确做法是:ws.send(JSON.stringify({msg:'hello'}))。

悟空
悟空

一款AI办公效率工具,主要用于阿里巴巴旗下钉钉推出的AI原生智能体工作台,适合需要提升相关任务效率的用户。

下载

Apifox、Postman或curl测试时,默认发送raw文本,不是WebSocket帧。这类工具根本无法模拟WebSocket握手和帧格式,【强行用它们测onMessage注定失败】。

真正有效的调试方式只有两种:浏览器原生WebSocket + console.log,或用wscat命令行工具:wscat -c ws://localhost:2345,连接成功后手动输入字符串回车发送。

Workerman接收缓冲区被污染或协议解析中断

如果服务曾处理过非法帧(比如客户端强行断开、发送非UTF-8字节、超长payload),Workerman内部WebSocket协议解析器可能卡在中间状态,后续合法帧也被跳过。此时onMessage不再触发,但连接仍显示活跃。

解决办法:重启Worker进程。不要只reload,要stop再start,确保协议解析器状态重置。

预防措施:在onMessage开头加兜底判断:if (!is_string($data) || empty($data)) { return; },避免空值干扰后续逻辑。

onMessage回调被意外覆盖或未绑定

检查是否写了多次$worker->onMessage = function() {...}。PHP中后赋值会完全覆盖前一个,如果你在不同文件或条件分支里重复赋值,最后一处生效,前面的逻辑彻底丢失。

典型错误:在Worker启动前先设了一个通用onMessage,又在某个if分支里重新赋值,结果只有分支成立时才生效;分支不成立时,onMessage为空函数,收不到任何数据。

验证方式:在onConnect里var_dump($worker->onMessage),输出NULL就说明没绑定,输出Closure说明已绑定。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Workerman安装配置教程
Workerman安装配置教程

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

2026.05.20

166

15

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

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

2026.05.20

202

12

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

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

2026.05.20

187

13

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

热门下载

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

精品课程

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

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习