必须验证消息真实抵达客户端,不能仅依赖http 200响应;需通过curl检查服务进程与端口连通性、前端js监听弹窗确认接收、chrome network抓包定位推送链路各环节是否正常。

Workerman主动推送信息代码写完后,必须验证消息是否真实抵达目标客户端,不能仅靠日志或返回码判断成功——因为HTTP 200响应只代表请求被服务端接收,不代表客户端已连接、未断开、未被拦截、未因跨域/证书/协议不匹配而静默失败。
用 curl 模拟推送请求快速验证
打开终端,执行以下命令(替换为你的实际地址和参数):
curl "http://127.0.0.1:2121/?type=publish&to=1001&content=%E4%BD%A0%E6%9C%89%E6%96%B0%E6%B6%88%E6%81%AF"
这一步操作起来很简单,直接把命令复制粘贴执行即可。如果返回 【{"status":"success","msg":"send ok"}】,说明推送服务进程正在运行且路由可达;若返回空、超时或 Connection refused,说明 Workerman 的 web-msg-sender 进程根本没启动,或端口被防火墙/安全组拦截。
前端页面实时监听并弹窗验证
在 HTML 页面中引入官方 JS 文件:
<script src="/static/js/web-msg-sender.js"></script>
然后添加监听逻辑:
webMsgSender.on("connect", function() { console.log("已连上推送服务"); });
webMsgSender.on("message", function(msg) { alert("收到推送:" + msg.content); });
注意:此 JS 必须在 WebSocket 连接建立后才能收到消息,而连接默认尝试 【ws://127.0.0.1:2121】,若你改了端口或启用了 WSS,必须同步修改 web-msg-sender.js 中的 wsUrl 配置,否则页面看似加载成功,实则从未连上服务端。
后台触发推送并抓包确认全流程
第一步:在 PHP 后台调用封装好的推送函数,例如:
$url = config('push.server_url') . '?type=publish&to=' . $uid . '&content=' . urlencode($msg);
https_request($url);
第二步:立即打开 Chrome 开发者工具 → Network 标签页 → 筛选 WS → 刷新页面并复现触发动作。
第三步:找到名为 /?type=publish... 的请求,点开看 Initiator 列是否指向你的 PHP 脚本行号;再点开对应的 WebSocket 帧(Frames),查看是否有来自服务端的 message 类型帧,内容是否与推送一致。
这一步能定位问题发生在哪一环:是 PHP 请求没发出去?是 Workerman 收到但没转发?还是前端 WebSocket 已断开却没重连?没有帧记录,基本可判定服务端未将消息投递到连接实例。











