前阵在做WebSocket的一些项目测试时,发现网上很多文章都说可以用Session来统计在线人数,我认为这里有误导的成分。
Session对于每个访客,会产生一个唯一的session_id,所以访客和session_id可以理解为class(类)和private(私有成员)的关系,不同的访客就是不同的class,不同的session_id就是不同的private成员。
所以访客A是访问不了访客B的Session数据的。
Session在服务器的存活时间默认情况下是1440秒,即24分钟。不过多数情况下大家都会根据自己的需要来设置这个值。那么问题就来了,当访客是非正常退出,比如最常见的就是直接关闭浏览器,这时候的Session数据因为还在存活期内、又没有接收到变更指令,所以是不会变化的,不管是写入数据库还是检查session_id文件,都无法有效避免这种情况。(如下图1)
上图是使用网上一个测试样例的测试结果。结果显示,在线的访客还有好多,红色的都是。而实际上除了1个是真正在线的,其他的都已经不在线了,连浏览器都关掉了的。
由此可见,用Session来统计在线人数的方案放到项目中是行不通的。要实现实时统计在线人数,可以使用WebSocket技术。
WebSocket技术广泛应用于日常生活中,如扫码登录、扫码支付等多端互动共同完成一件事的场景。(如图2)
上图是一个WebSocket项目的测试场景,实现多端互动完成扫码支付和即时通知的功能。不过使用WebSocket技术来统计在线人数,是不是有点大材小用呢?