检测在线用户:PHP

时间:2010-12-11 21:06:05

标签: php

我正试图通过PHP制作“X用户当前正在查看此页面”的内容。我该怎么做?谢谢。

5 个答案:

答案 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)

  1. 创建一个存储以下内容的数据库表:
    • 用户IP和使用者组合的哈希
    • 时间戳
  2. 每次页面加载时,将用户IP和Useragent组合的哈希值与当前时间戳存储到数据库中
  3. 查询数据库中包含时间戳为NOW()的唯一条目数 - X分钟范围
  4. 显示活跃用户的大致数量
  5. 通过

    扩展基本理念
    1. 有一个间隔产生AJAX调用脚本,该脚本更新数据库以考虑在页面上停留时间超过X分钟的用户

答案 2 :(得分:1)

没有故障安全的方法,但有几种选择。

  1. 保存上次访问数据库的人员。如果它在某个阈值(比如5分钟)内,它们就会在线。
  2. 这种方式不太可靠,但偶尔使用AJAX ping(正确的术语?)服务器告诉它你还在线。这允许用户长时间翻页,而不会使他们的“在线”时间超时。
  3. 你甚至可以使用两者的组合。

    如果您有大量流量,则应缓存第一个选项。您不希望为每个页面加载运行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”);