[英]Detecting online users: PHP
我正在尝试通过PHP做出这样的信息:“当前正在浏览此页面的用户数量为X”。 我该怎么做? 谢谢。
在网络上没有“当前查看”的概念,因为一切都作为非持久连接发生。 可以得到的最接近的结果是“ X个用户在最近N秒钟内浏览了此页面”(如果您选择的N值足够小,则可以说这几乎是等效的)。
然后, 要使用户A在PHP中基于用户B的操作查看数据,您需要具有一些持久性存储,通常是像MySQL这样的数据库 (但是memcached或xcache也可以工作,如果您不必担心丢失的话)服务器崩溃时的数据)。
只需将诸如“用户X在时间Z查看了页面Y的用户”之类的内容写入到持久存储中,并在显示页面Y时,查询存储中最近N秒内页面Y的所有视图,并计算不同用户的数量。
在SQL中:
INSERT INTO visits (user, page, time) VALUES (?,?,NOW())
SELECT COUNT(DISTINCT user) FROM visits
WHERE page = ? AND time < NOW() - INTERVAL 10 SECONDS
您可以让用户通过定期提交AJAX请求(或在页面上放置一个小的iframe
,每隔几秒钟自动加载一次而无需JavaScript)来告诉服务器“我仍在查看”。
通过扩展基本思想
没有执行此操作的故障安全方法,但是有两种选择。
您甚至可以将两者结合使用。
如果流量很大,则应缓存第一个选项。 您不想在SELECT * FROM users WHERE lastvisit > UNIX_TIMESTAMP() - 18000
为每个页面加载SELECT * FROM users WHERE lastvisit > UNIX_TIMESTAMP() - 18000
运行SELECT * FROM users WHERE lastvisit > UNIX_TIMESTAMP() - 18000
。 另一种选择是每分钟左右运行一次守护程序,然后将在线用户存储在单独的表中。
注意 :这里假设您说的是用户。 如果要在线邀请嘉宾人数,请参阅@code_burgar的答案。
创建一个带时间的会话变量:
$_SESSION['time']=time();
$time=time();
$query="INSERT INTO `online`(`name`, `time`)VALUES ('$name','$time')";
**// insert the time and username into the DB..**
if(time() - $_SESSION['time'] >=60)
**//check for ths condition if the user is available do the same thing again**
$_SESSION['time']=time();
$time=time();
$query="INSERT INTO `online`(`name`, `time`)VALUES ('$name','$time')";
检索在线用户时:
$t=time();
// this will help u to remove the records that are not useful for u.
// **thus helping you to use less space on your database**
mysql_query("DELETE from online WHERE '$t'-time >60");
最后,执行:mysql_query(“ SELECT * FROM online”);
您确实不能这样做,因为您不知道何时有人停止查看页面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.