我正试图通过PHP制作“X用户当前正在查看此页面”的内容。我该怎么做?谢谢。
答案 0 :(得分:4)
网上没有“当前正在查看”的概念,因为所有内容都是非持久性连接。你可以得到的最接近的是“X用户在过去的N秒内查看了这个页面”(如果你选择的N值足够小,你可以说它非常相同)。
然后,要让用户A基于用户B的操作查看数据,在PHP中,您需要有一些持久存储,通常作为像 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重新加载自己)让用户告诉服务器“我还在查看”。
答案 1 :(得分:2)
通过
扩展基本理念答案 2 :(得分:1)
没有故障安全的方法,但有几种选择。
你甚至可以使用两者的组合。
如果您有大量流量,则应缓存第一个选项。您不希望为每个页面加载运行SELECT * FROM users WHERE lastvisit > UNIX_TIMESTAMP() - 18000
。另一个选择是每隔一分钟左右运行一个守护进程,并将在线用户存储在一个单独的表中。
注意:当您说出来时,这假设您确实意味着用户。如果您想在线来宾的数量,请参阅@ code_burgar的答案。
答案 3 :(得分:0)
你真的不能,因为你不知道某人何时停止查看页面。
答案 4 :(得分:0)
使用时间创建会话变量:
$_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”);