繁体   English   中英

检测在线用户:PHP

[英]Detecting online users: PHP

我正在尝试通过PHP做出这样的信息:“当前正在浏览此页面的用户数量为X”。 我该怎么做? 谢谢。

在网络上没有“当前查看”的概念,因为一切都作为非持久连接发生。 可以得到的最接近的结果是“ X个用户在最近N秒钟内浏览了此页面”(如果您选择的N值足够小,则可以说这几乎是等效的)。

然后, 要使用户A在PHP中基于用户B的操作查看数据,您需要具有一些持久性存储,通常是像MySQL这样的数据库 (但是memcachedxcache也可以工作,如果您不必担心丢失的话)服务器崩溃时的数据)。

只需将诸如“用户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. 创建一个存储以下内容的数据库表:
    • 用户IP和Useragent组合的哈希
    • 时间戳
  2. 每次页面加载时,将用户IP和Useragent组合的哈希以及当前时间戳存储到数据库中
  3. 查询数据库以获取时间戳落在NOW()-X分钟范围内的唯一条目数
  4. 显示活动用户的大概数量

通过扩展基本思想

  1. 间隔产生对脚本的AJAX调用,该脚本将更新db以说明用户在页面上停留了超过X分钟的时间

没有执行此操作的故障安全方法,但是有两种选择。

  1. 在数据库中保存该人上次访问的时间。 如果在一定阈值之内(例如5分钟),则表明他们在线。
  2. 这种方式不太可靠,但有时会使用AJAX对服务器进行ping( 正确的称呼? ),以告诉您您仍然在线。 这使用户可以长时间翻页,而不会使其“在线”时间超时。

您甚至可以将两者结合使用。

如果流量很大,则应缓存第一个选项。 您不想在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM