Workerman广播需分单进程与多进程场景:单进程设worker->count=1后遍历connections;多进程必须用Channel组件或GatewayWorker框架,后者推荐;也可通过web-msg-sender服务间接广播。

Workerman实现广播消息给所有在线用户,本质是遍历当前进程内所有活跃连接并调用send()方法,但必须明确:多进程下默认无法跨进程广播,否则90%的连接收不到消息。
单进程模式下直接遍历connections
适用于开发调试或低并发场景,无需额外组件,但【worker->count必须设为1】,否则其他进程里的连接对象根本不可见。
第一步:创建WebSocket Worker实例,监听指定端口
第二步:将$worker->count = 1;写在Worker初始化之后、runAll()之前,这是硬性前提,漏掉就永远广播不全
第三步:在onMessage回调中,用foreach遍历$worker->connections → 对每个$connection调用$connection->send($message)
注意:这个循环会把消息发给发送者自己,如果不想回显,得加if ($connection !== $connection_from_sender)判断
多进程下借助Channel组件跨进程广播
生产环境必须用,否则一开多进程,用户连到不同进程,消息就卡死在单个进程里出不去。
方法一:使用Workerman内置Channel类做进程间消息中转
先在主进程启动时new Channel()并赋值给全局变量,所有子进程通过Channel::getInstance()获取同一实例
各进程监听Channel的publish事件 → 收到消息后,再各自遍历本进程connections进行本地广播
客户端发消息时,不直接广播,而是$channel->publish('broadcast', $data),由Channel分发到所有进程
方法二:改用GatewayWorker框架(推荐)
它把业务逻辑和网络通信分离,Gateway负责收发,BusinessWorker处理业务,天然支持group、client_id、all等广播维度
调用$gateway->sendToAll($message)即可全量推送,底层自动处理多进程、多服务器、断线重连
【不要自己手撸多进程广播逻辑,GatewayWorker已稳定迭代多年,踩坑成本远低于自研】
通过web-msg-sender服务间接广播
适合已有HTTP后端系统,不想改动WebSocket服务代码,用独立HTTP接口触发广播。
下载web-msg-sender项目,解压后运行php start.php start -d
后端PHP用curl向http://127.0.0.1:2121/?type=publish&content=xxx发起GET请求
前端页面需额外引入web-msg-sender提供的client.js,并建立WebSocket连接监听
这一步必须确保web-msg-sender服务正在运行且端口未被占用,否则curl请求会超时失败

















