1、添加能查询匹配所有channel,场景适用于群发,如订阅了private-group-uid,可通过查询group,匹配到所有订阅者。即:$push->getChannelInfo('-group-', ['info' => 'channels'])
参考代码添加到711行:
case 'channels': //获取所有匹配包含的渠道号
$channels = isset($this->_globalData[$app_key]) ? array_keys($this->_globalData[$app_key]) : [];
$channel_info = [];
foreach($channels as $value) {
if (strpos($value, $channel) !== false) { //channel支持前中后包含匹配
$channel_info[] = $value;
}
}
break;
2、添加能查询某channel下的所有users,场景适用于直播房间用户列表,如订阅了presence-live-uid,可查询其下所有订阅者信息。即:$push->getChannelInfo('presence-live-uid', ['info' => 'users'])
参考代码添加到711行:
case 'users':
$channel_info['users'] = $user_count > 0 ? $this->_globalData[$app_key][$channel]['users'] : [];
break;
webman/push最好只做通讯,其它的尽量都不做
问题
如果在线连接数很多,比如上万在线的话,你加的这2个接口有点耗费性能。
尤其是返回 channel下的所有users,如果channel有1万个user,返回的数据可能达到10M,每秒调用10次,G口带宽直接打满,每秒100MB的数据序列化反序列化cpu也炸了。
推荐做法
推荐做法应该是利用
webman/push
的webhook来接收订channel增减事件,把所有关注的channel存在存储里。读取的时候也应该是部分读取,貌似没有什么场景需要一次性读所有人的数据。1、关于第一个接口说的群发问题,可以直接让用户订阅某个群id的channel,这样调用一次trigger接口就可以群发了。
2、关于第二个接口,用户信息最好存mysql等存储中,从存储中读取。直播房间用户列表也只是展示很小一部分用户(可能就几个),没必要从push中读所有人的数据。
在线人数少,这2个接口调用频率低没什么问题,在线人数多的话不建议调用这2个接口。
谢谢指点,push插件中,webhook有获取在线user_id的接口:user_added和user_removed。请问下,直接用该webhook接口获取user_id,channel多了会影响性能吗?
不影响性能
我做的是在线课堂直播,需要知道某个房间的全部在线用户,但是用户只订阅了该房间private-live-1,我想改成订阅presence-live-1,然后获取到所有user_id