必须确保Workerman服务已启动、2120端口可访问且type=publish参数正确,否则返回空、超时或404;WebMsgSender是独立PHP进程,需用php start.php status和netstat验证运行状态,并在安全组放行端口。

直接用 curl 向 Workerman 的 WebMsgSender 接口发 POST 请求就能推送,但必须满足三个前提:Workerman 服务已启动、端口可访问、type=publish 参数正确。否则返回空、超时或 404,不是代码问题,是服务链路断了。
确认 WebMsgSender 服务是否真正运行中
很多人卡在这一步却以为是 PHP 代码错了。WebMsgSender 默认监听 2120 端口(非 80 或 443),且不走 Apache/Nginx —— 它是独立的 PHP 进程。
- 执行
php start.php status查看进程状态,输出里要有WebMsgSender和对应端口(如2120) - 用
netstat -tuln | grep :2120确认端口被 PHP 进程占用,而非被防火墙拦截 - 云服务器必须在安全组放行该端口(入方向),本地测试可用
curl -v http://127.0.0.1:2120验证连通性 - 如果改过端口(比如改成
2121),$push_api_url必须同步更新,不能只改配置文件不重启服务
curl_setopt 关键参数不能省略
WorkMsgSender 的 API 是纯 HTTP 接口,不依赖 session 或 cookie,但对请求头和数据格式敏感。少一个选项就可能返回空字符串或 500 错误。
-
CURLOPT_RETURNTRANSFER必须设为1,否则curl_exec直接输出响应体,PHP 拿不到返回值 -
CURLOPT_POST必须显式设为1,不能只靠CURLOPT_POSTFIELDS自动触发 -
CURLOPT_POSTFIELDS传数组即可,Workerman 会自动解析为application/x-www-form-urlencoded,不要手动http_build_query - 加
CURLOPT_HTTPHEADER => ['Expect:']可避免某些环境下因 Expect 100-continue 导致的阻塞
推送请求的 to 字段行为要清楚
这个字段控制消息范围,但它的值不是“用户 ID”那么简单,而是取决于前端登录时上报的 uid 格式。
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
立即学习“PHP免费学习笔记(深入)”;
-
to为空字符串("")→ 推给所有在线客户端(广播) -
to为数字或字符串(如"123")→ 只推给前端调用socket.emit('login', '123')登录的连接 -
to为数组(如["123", "456"])→ WorkMsgSender 不支持,会静默失败;需循环调用或改用自定义协议 - 注意前后端
uid类型一致:前端传"123",后端就不能传123(整型),否则匹配不上
调试时别只看 var_export($return)
curl_exec 返回空,并不等于推送失败——可能是成功返回了 {"ret":0,"msg":"ok"} 但你没打印,也可能是 Workerman 日志里已记录错误但没透出到 HTTP 响应。
- 先查 Workerman 日志:
cat ./runtime/logs/workerman.log,看是否有publish相关记录或警告 - 用
curl -v手动模拟请求,观察 HTTP 状态码(200 ≠ 成功,要看响应体内容) - 确保
content字段是 UTF-8 编码字符串,含中文时不要用 GBK,否则 Workerman 解析失败会丢弃整条消息 - 生产环境别用
http://workerman.net:2120这类示例地址,必须换成你自己的内网 IP 或域名,外网暴露2120端口有风险
最常被忽略的是:Workerman 进程没以守护模式启动,或者启动后被系统 OOM killer 杀掉,表面看着在跑,实际已僵死。每次上线前,务必用 ps aux | grep start.php 和 tail -f runtime/logs/workerman.log 双重确认。


















