检测在线用户:PHP

4
我正在尝试通过PHP创建一个东西,它会显示“X个用户当前正在查看此页面”。我该如何做?谢谢。

如果你有大量的流量,这不是一个好主意。 - Vlad.P
2
这个问题应该可以回答你的:http://stackoverflow.com/questions/890820/find-out-how-many-users-are-online-in-php - thejh
5个回答

4
在Web上,没有“当前查看”的概念,因为所有事情都是作为非持久连接发生的。你能得到的最接近的是“在过去的N秒内有X个用户查看了这个页面”(如果你选择一个足够小的N值,那么你可以说它几乎等价)。
然后,在PHP中,要让用户A根据用户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)来告诉服务器“我仍在浏览”。


你可以在JavaScript中监听关闭浏览器事件以处理关闭(虽然当浏览器崩溃时,您又回到了起点)。 - Alfred
@Alfred:而且我认为IE不支持onbeforeunload。但是,人们可以将这些解决方案组合使用。 - Jonah
你可能想要提到它会累积视图,并且必须定期清理(即通过守护进程)。过一段时间后,你会发现里面有每个用户 :) - Jonah
访问数据是否应丢弃取决于 @foob,每个用户在每篇文章中都有访问数据 可能 会很有用;-) 我可能会使用 xcache 和/或 memcached 实现这一点,不过 - 没必要为此冲击 MySQL。 - Victor Nicollet

2
  1. 创建一个数据库表格,存储以下信息:
    • 用户IP和Useragent组合的哈希值
    • 时间戳
  2. 每次页面载入时,将用户IP和Useragent组合的哈希值以及当前时间戳存储到数据库中
  3. 查询数据库,获取时间戳在NOW() - X分钟范围内的唯一条目数
  4. 显示大约活跃用户数量

通过以下方式扩展基本想法:

  1. 生成间隔 AJAX 调用到一个脚本,更新数据库以考虑用户停留在页面上超过 X 分钟的情况

这个答案是用来计算在线“访客”数量的。 - Jonah
1
由于OP没有明确指定他认为“用户”是什么,因此您的评论可能相关或不相关 :) - code_burgar

1

做这件事没有绝对的方法,但有几个选择。

  1. 在数据库中保存上次访问时间。如果在某个阈值内(例如5分钟),则表示用户在线。
  2. 这种方式不太可靠,但是可以通过AJAX定期向服务器发送ping请求,以告知其仍处于在线状态。这使得用户可以长时间保持页面打开状态而不会被强制下线。

甚至可以结合两种方式。

如果您有大量流量,则应缓存第一种选项。您不希望在每次页面加载时运行 SELECT * FROM users WHERE lastvisit > UNIX_TIMESTAMP() - 18000。另一种选择是每分钟运行一个守护进程,并将在线用户存储在单独的表中。

注意:这假设当您说“用户”时,您确实是指用户。如果您想了解在线访客的数量,请参阅 @code_burgar 的答案。


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");

0

你真的做不到,因为你不知道有人何时停止查看页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接