------解决方案--------------------每个页面中都加入公共js文件,里面的某个js函数负责定时向某php文件(如a.php)发送ajax请求。最后请求时间由a.php每次写入session
比如设定每2分钟发送一次请求。在需要获取用户是否在线的页面上,读出session里的最后请求时间,当前时间减去最后请求时间,若大于2分钟,则用户已离线。
------解决方案--------------------这个问题网上可以顺手找到很多案例。
如果想采用最轻巧的,可以统计session临时文件数量或其它存储方式的单元数量,来确定当前20分钟内有多少在线。当然,这个时间精确度可以缩小到一分钟(随之而增长的是会话回收机制的消耗)。
无论采取任何方案,这个功能还是对服务器有不少消耗,如果不是很必要,建议放弃。
------解决方案--------------------正确的思路并且不借助memcache等第三方工具的方法是
分析:在线统计难点是在于不存在全局共享的方法
解析办法:
利用文件来保存在线用户的信息,这样对文本的处理实际上还比数据库快很多(php连数据库的时间就已经超过了php读取一个小文本的时间)
文本里保存的格式为数组,格式为
<br />
<?php<br />
return array(<br />
20312=>13671927362,//key值为用户uid value值当用户登陆的时间戳<br />
20313=>13671927363,<br />
);<br />
1:当用户登陆时,获取当前时间戳,session记录用户id
2:然后获取文本里的文件,里面保存了在线用户的信息,判断当前uid是否存在这里面,不存在就插入,然后继续保存
3:在线人数获取,就读取文件,然后count出在线人数
4:只要当访问这个文件的时候(不管你是准备统计在线人数,还是有新用户加入),遍历文本里的数据,判断各个用户的时间戳是否小于当前时间戳并超过半小时,如果是,那么就去掉这个用户信息.
实现步骤关键点:
以数组获取文本
$online=require 'xxx.php';
以数组保存文本
$data[1111]=123748492;
file_put_contents('xx.php','');
不谢!
------解决方案--------------------存入普通文件的关键,是写入时候的资源独占问题。
------解决方案--------------------
1、当然可以读取 session 临时文件。你可以在 session.save_path 指定的地方找到他们
2、session 临时文件是纯文本文件。是用简化的序列化格式存储的,php 已然提供了 session 序列化和反序列化的函数。你自己看一下就知道了
你们都在讨论如何存储的问题,其实如何存储并不是主要问题
关键在于“如何识别”,既然一致认为“非正常渠道离开”的检查是需要轮询的。那就把的种方案都弄出来PK一下就是了(假定有一万个用户在线)