workerman 5.0升级后推送失效,主因是reload不重载顶层代码、opcache缓存旧逻辑、uid解绑未调用gateway::unbinduid及webserver需显式实例化。

Workerman主动推送信息版本升级后推送功能突然失效,表现为客户端收不到消息、日志无错误但连接数归零、或HTTP推送接口返回空响应,这类问题多由API变更、reload机制失效或opcache缓存旧逻辑导致。
确认 reload 是否真正触达业务代码
执行 php start.php reload 后,检查 onMessage 或事件回调中的日志是否更新——若日志没变,说明 reload 没生效。
Workerman 5.0 的 reload 只会重新加载 onConnect/onMessage/onClose 回调内动态引入的文件,【start.php 顶层 require 的配置或全局函数不会重载】。
把所有业务逻辑(包括消息组装、UID绑定、Gateway::send()调用)全部封装进 onMessage 或自定义事件方法中,禁止在 start.php 文件顶部写死推送逻辑。
检查 opcache 是否禁用或强制刷新
运行 php --ri opcache,确认 opcache.enable=1 且 opcache.revalidate_freq > 0。
若未禁用 opcache,reload 后 PHP 仍执行旧字节码,推送逻辑实际未更新。临时解决:在 reload 后手动加一行 opcache_reset() 到 start.php 的 onWorkerStart 回调里;生产环境应设 opcache.revalidate_freq=0 或禁用 opcache。
验证 UID 绑定与连接清理是否兼容新版本
第一步:检查 Events.php 中 onConnect/onClose 是否仍使用 Gateway::bindUid 和 Gateway::unbindUid。
第二步:确认 onClose 中是否仅 unset($worker->uidConnections[$uid]),这种写法在 Workerman 5.0 中已不安全——【必须配合 Gateway::unbindUid($client_id) 显式解绑】,否则连接残留导致后续推送找不到目标。
第三步:在 onMessage 处理推送前,加一行 var_dump(Gateway::isUidOnline($uid)) 验证目标 UID 是否真实在线,避免因绑定失效静默丢消息。
排查 HTTP 推送接口协议变更
方法一:直接访问 http://127.0.0.1:2121/?type=publish&to=1001&content=test,看是否返回 success 字样。
方法二:若使用自定义域名或 Nginx 反代,确认是否拦截了 query string 中的 type/publish 参数——Workerman 5.0 的 web-sender 默认只响应 GET 请求,且不支持 POST 提交推送内容。
方法三:检查 start_webserver.php 中是否仍启用 WebServer Worker;5.0 版本要求 WebServer 必须显式 new WebServer 并设置端口,旧版自动监听 2121 端口的方式已失效。











