Workerman主动推送需显式创建text协议内部Worker监听127.0.0.1:5678,解析JSON指令提取uid/content,手动调用send向指定uid广播;业务端须以换行符结尾发送原始文本;权限未设$user时须确保运行用户对日志/PID路径有写权;心跳超时清理必须同步从uidConnections数组中unset连接,否则3小时内内存超1.2GB。

Workerman主动推送信息时,新手常以为只要启动服务、发个HTTP请求就能把消息推到前端,结果测试时连接能建、消息发不出、或者推送后用户收不到——根本原因是内部通信通道没打通,而这个通道的端口和协议配置恰恰被跳过不看。
内部推送通道必须显式开启
第一步:在WebSocket Worker实例创建后,立即新增一个text协议的内部Worker,监听本地回环地址(127.0.0.1)上的独立端口,例如5678。
第二步:给这个text Worker绑定onMessage回调,接收JSON格式的推送指令,解析出uid和content字段。
第三步:在回调里调用$connection->send()向指定uid连接广播消息——【这一步必须手动实现,Workerman默认不提供UID广播能力】。
第四步:确保你的业务代码(比如ThinkPHP控制器)通过curl或file_get_contents向http://127.0.0.1:5678发送原始文本数据,格式为{"uid":"1001","content":"新订单已分配"}+换行符。
Worker进程用户权限配置被直接跳过
方法一:Linux下以root权限启动Worker(如sudo php start.php start -d),再在Worker初始化时设置$user属性为www-data或www。
方法二:不设$user,但必须确认当前运行用户对日志目录、PID文件路径有写权限,否则Worker silently fail,连错误日志都不生成。
【未设置Worker::$user且用root运行,会导致所有子进程继承root权限,一旦被攻击可直接提权】
心跳超时与连接清理不同步
第一步:启用Timer定时扫描所有连接的lastMessageTime时间戳。
第二步:若当前时间减去lastMessageTime超过55秒,主动调用$connection->close()断开。
第三步:在onClose回调中,必须从自维护的uidConnections数组里unset对应连接——【仅unset $worker->connections里的引用不够,你的业务层映射必须同步清理】。
这一步漏掉,内存泄漏会在3小时内让Worker进程占用超1.2GB内存,且无法GC回收。

















