Laravel 9中如何获取直播实时观看人数?(co-streamer+plyr环境)
实时观看人数统计方案推荐
一、替代轮询的更优技术方案
- WebSocket 双向通信:这是比Ajax轮询高效得多的方案,服务器可主动推送观看人数变化,无需客户端反复发起请求,延迟更低、服务器负载更小。
- 实现思路:在co-streamer端维护在线连接计数,每个观众打开页面时建立WebSocket连接,计数加一;断开连接时计数减一。当人数变化时,服务器主动向所有连接的客户端推送最新数值,Plyr侧监听WebSocket消息,实时更新页面显示。
- 简化代码示例:
客户端:
服务器端(假设co-streamer基于Node.js扩展):const ws = new WebSocket('ws://your-co-streamer-server/ws/viewers'); ws.onmessage = (event) => { const viewerCount = JSON.parse(event.data).count; document.getElementById('viewer-count').textContent = `${viewerCount} 人观看`; }; window.addEventListener('beforeunload', () => ws.close());const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); let viewerCount = 0; wss.on('connection', (ws) => { viewerCount++; wss.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) { client.send(JSON.stringify({ count: viewerCount })); } }); ws.on('close', () => { viewerCount--; wss.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) { client.send(JSON.stringify({ count: viewerCount })); } }); }); });
- Server-Sent Events (SSE):如果WebSocket实现复杂,SSE是轻量的单向服务器推送技术,自带重连机制,适合仅需服务器向客户端发数据的场景,实现成本更低。
- 客户端代码示例:
const eventSource = new EventSource('/stream-viewers'); eventSource.onmessage = (event) => { const viewerCount = event.data; document.getElementById('viewer-count').textContent = `${viewerCount} 人观看`; };
- 客户端代码示例:
二、现成工具/集成方案
- co-streamer 原生扩展:优先查看co-streamer官方文档,确认是否有内置的观看人数统计模块或社区插件,原生集成的方案兼容性最佳,无需从零开发。
- Socket.io:封装了WebSocket及降级方案(如轮询),支持房间功能,可按不同流区分观看人数,多流场景下更易用。在co-streamer端集成Socket.io后,Plyr客户端通过其监听人数变化即可。
- Redis 原子计数+推送:用Redis的
INCR/DECR原子命令维护观看人数(观众连接时加一,断开时减一),再结合WebSocket/SSE将Redis中的计数推送给客户端,适合高并发场景,计数准确且性能稳定。 - Countly:开源用户分析工具,支持实时在线用户统计,可集成到流媒体场景中,除了观看人数,还能追踪观众播放行为等附加数据。
三、实用优化点
- 过滤无效连接:通过监听Plyr的
play事件,仅将正在播放视频的用户计入观看人数,避免页面打开但未播放的闲置连接干扰统计。 - 异常处理:添加WebSocket/SSE断开后的自动重连逻辑,避免人数显示停滞;服务器端将计数持久化到Redis,防止服务重启后数据丢失。
内容的提问来源于stack exchange,提问作者Muhammad Shah Sawar
相关产品推荐
相关产品推荐

