Laravel/Vue+Pusher场景下无需加入Presence房间获取在线人数咨询
基于Laravel/Vue+Pusher的未进房查看在线人数实现方案
方案1:Pusher Webhook同步数据到后端(推荐,适合绝大多数场景)
- 操作步骤:
- 进入Pusher控制台,在Webhooks配置页新增webhook,勾选
member_added和member_removed两个事件,回调地址填写你的Laravel服务的公开路由,例如/api/pusher/room-stats-webhook - Laravel端新增对应路由和处理逻辑,首先验证Pusher请求的签名合法性(避免伪造请求篡改数据),收到
member_added事件时对对应房间的在线数字段执行原子increment操作,收到member_removed时执行原子decrement操作 - 后端新增公共广播频道,例如
public:room-stat-updates,每次更新房间在线数后,将房间ID和最新在线数广播到该公共频道 - 前端房间列表页首次加载时从后端接口拉取全量房间数据和对应在线数,同时订阅上述公共频道,收到更新消息时实时替换列表中对应房间的在线数
- 进入Pusher控制台,在Webhooks配置页新增webhook,勾选
- 优势:前端仅需订阅1个公共频道,性能开销极低,支持大规模房间场景,实时性可控
- 补充优化:每日定时跑脚本调用Pusher服务端的
get_channels接口拉取全量Presence房间的真实在线数,和数据库存储的数值做校准,避免webhook丢包导致的数据偏差
方案2:后端调用Pusher REST接口拉取实时数据(适合房间数量少的场景)
- 操作步骤:
- Laravel的房间列表接口中,直接调用Pusher服务端SDK的
get_channels方法,通过参数指定筛选presence-前缀的频道,同时拉取user_count字段,示例代码:
$pusherChannels = Pusher::getChannels(['info' => 'user_count'], 'presence-');- 遍历返回的频道数据,将
user_count和本地房间数据做关联后返回给前端 - 给该接口加10~30秒的缓存,避免频繁调用Pusher接口触发限流
- Laravel的房间列表接口中,直接调用Pusher服务端SDK的
- 优势:无需开发webhook逻辑,实现成本极低,数据天然准确无需校准
- 限制:仅适合房间总数小于50的场景,房间过多会导致接口响应变慢,且频繁调用Pusher接口会增加额外成本
方案3:前端临时订阅拉取(不推荐,仅应急使用)
- 操作步骤:前端加载房间列表时,遍历所有房间ID临时订阅对应Presence频道,拿到订阅成功事件返回的
members.count后立即调用unsubscribe退订该频道 - 缺陷:房间数量稍多就会产生大量无效订阅/退订请求,容易触发Pusher的流量限制,仅适合房间数少于10的小型项目临时使用
通用注意事项
- 所有Pusher服务端接口的调用必须放在Laravel后端执行,禁止将Pusher的密钥、Secret等敏感信息暴露给前端
- 若使用webhook方案,需在Laravel的
VerifyCsrfToken中间件的$except数组中加入webhook路由,避免请求被CSRF校验拦截
内容的提问来源于stack exchange,提问作者ArcticMediaRyan
相关产品推荐
相关产品推荐

