Workerman无法接收客户端消息怎么办

小婷酱_6626

小婷酱_6626

2026-06-28

562人浏览

原创

客户端消息onmessage收不到,根本原因是监听地址为127.0.0.1导致外部请求被内核丢弃,必须改为0.0.0.0:端口并完整重启;同时需确保协议一致(tcp/http/websocket)、防火墙/安全组放行端口,并用ss -tuln和file_put_contents日志验证生效。

workerman无法接收客户端消息怎么办

Workerman服务端明明运行着,客户端也显示已连接,但发来的消息在onMessage里完全收不到,日志里连连接建立的痕迹都没有——这种情况不是代码漏写了回调,而是网络层或协议层根本没把数据送到Workerman手里。

检查监听地址是否对外暴露

打开你的启动文件(如start.php),找到Worker实例化那行,确认协议地址写的是0.0.0.0:端口号,而不是127.0.0.1:端口号。

这一步必须改:监听127.0.0.1只响应本机回环请求,外部设备(哪怕同局域网)发包过来,Linux内核直接丢弃,Workerman连SYN都收不到,更别说onMessage了。

改完不能只reload:执行php start.php stop && php start.php start完整重启,否则旧配置仍在内存中生效。

验证是否生效:运行ss -tuln | grep :你的端口,看到*:你的端口或0.0.0.0:你的端口才算成功;如果还显示127.0.0.1:你的端口,说明代码没重载或被其他配置覆盖。

确认客户端实际走的是TCP还是HTTP协议

方法一:用curl测试HTTP请求(适合启用了Http协议的Worker)
执行curl -X POST -d "msg=test" http://服务器IP:端口/,再看onMessage是否触发。如果没反应,大概率你启的是TCP Worker,却用HTTP方式发包——TCP Worker根本不解析HTTP头,收到的只是原始字节流,可能因缺少换行或协议头被直接忽略。

方法二:用telnet或netcat直连TCP端口(适合裸TCP Worker)
执行telnet 服务器IP 端口,连上后手动敲一行文字+回车。如果onMessage立刻打印出内容,说明TCP通路正常;如果无响应,问题不在Workerman逻辑层,而在网络或防火墙。

【关键前提】客户端和服务端协议类型必须严格一致:硬件模块(如ESP32)默认发裸TCP,你就不能用websocket://0.0.0.0:8080启动——握手失败会导致秒断,且onMessage根本不会被调用。

排查防火墙与云安全组拦截

第一步:在服务器本地执行telnet 127.0.0.1 端口,能通≠外部能通。loopback流量不经过firewalld或云安全组,这只是验证Workerman进程本身是否存活。

X Studio
X Studio

X Studio是一款由网易云音乐与小冰公司合作推出的 AI 歌声合成软件。

下载

第二步:查当前开放端口sudo firewall-cmd --list-ports,若列表里没有你的端口,立即添加:sudo firewall-cmd --add-port=端口号/tcp --permanent,然后sudo firewall-cmd --reload。

第三步:如果是阿里云、腾讯云等,必须登录控制台进「安全组」,添加入方向规则,协议选TCP,端口填你的端口号,源IP先设为0.0.0.0/0用于测试——很多故障就卡在这一步,控制台规则没配,光改服务器防火墙没用。

Windows/macOS下跑WSL或VirtualBox时,宿主机系统防火墙也要关掉或加例外,否则流量在进虚拟网卡前就被拦了。

验证onMessage是否真被触发

在onMessage回调开头强行加一句日志:file_put_contents('/tmp/workerman.log', date('Y-m-d H:i:s') . " onMessage triggered\n", FILE_APPEND);。

然后让客户端发一次消息,立刻执行tail -f /tmp/workerman.log盯住输出。如果日志完全没新增,说明数据根本没进到Workerman事件循环;如果有时间戳但没打印$data内容,才是协议解析或编码问题。

注意:某些IDE调试器或PHP-FPM环境会屏蔽标准输出,echo/print_r可能看不见,但file_put_contents一定落盘,这是最可靠的触发验证手段。

检查连接是否被意外关闭

① 在onConnect回调里加日志,确认客户端连上来时Workerman有没有记录;
② 在onClose回调里加日志,看连接是主动断开还是被动踢出;
③ 如果onConnect有日志、onMessage始终没有,且onClose也没触发,基本可断定数据包在网络链路中丢失或被中间设备(如路由器、负载均衡)静默丢弃。

此时需用tcpdump抓包:tcpdump -i any port 端口号 -w debug.pcap,然后用Wireshark打开,过滤客户端IP,确认SYN→SYN-ACK→ACK三次握手是否完成,以及客户端发的DATA包服务端是否真的收到了。

相关文章

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

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

下载

相关标签:

workerman

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

相关专题

更多
开发工具有哪些
开发工具有哪些

开发工具有:1、集成开发环境IDE;2、版本控制系统VCS;3、自动化构建工具;4、测试工具;5、代码分析工具。本专题为大家提供开发工具有哪些的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2746

5

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

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

2026.05.20

186

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

207

13

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

2026.10.21

20

15

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

2026.10.21

0

16

Playwright 入门教程
Playwright 入门教程

Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。

2026.10.21

0

16

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

120

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

80

10

热门下载

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

精品课程

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

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

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

共0课时 | 0人学习