PHP:跟踪用户是否在线的最有效方法?

时间:2012-05-25 04:19:41

标签: php tracking scalable

我正在开发一个具有可扩展性的我的项目,我已经走到了一个十字路口。在我的网站上,我想检测用户是否在线。我无法想到处理这个问题的最佳方法。我想的方式就是沿着这些方向(在伪代码中):

// SQL user table:
user {
  "name": "blah blah",
  "email": "derpy@derpyderp.com",
  "online": false
}

因此,每当用户登录时,我都可以将他的online列更新为true。然而,这最终会导致每次用户登录时发生SQL查询,如果发生这种情况,我会说,每秒10次登录,那就是发生了很多查询。另一种方式我认为我可以做同样的事情,但在另一个表中:

// Activity table:
activity {
  "user_id": 2,
  "online": true
}

出于某种原因,我认为由于与user表的分离,这将导致更少的内存消耗。但是我不确定它是否会对性能产生实际影响。

所以,如果你能用你的见解祝福我,我会更感激,谢谢你。

3 个答案:

答案 0 :(得分:9)

一般来说,通常会在users表中添加一列来存储lastActivity时间。用户每次登录或访问页面时,都会将当前时间存储在该字段中。如果您想知道他们是否在线,请查看上次录制的时间是否在特定窗口内 - 例如,五分钟。您可以查询所有行,以查看当前有多少用户在线。

我不会太担心每隔几秒就会运行一次查询 - 你的服务器可以处理它(假设它们编写得很好而且不是很冗长)。

答案 1 :(得分:0)

您可以将日期时间用于字段类型,不要忘记记录用户IP,以便跟踪时间o

答案 2 :(得分:0)

根据您的工作方式,您基本上有两种选择:

定义超时后您考虑用户注销 使用ajax / websockets / whatever来轮询用户

       1: Timeout

这是一个更简单的用例。每次用户请求页面时,都会更新数据库中的时间戳。

要了解有多少用户在线,您可以对此数据库进行查询,并执行在最近N分钟内处于活动状态的COUNT个用户。

通过这种方式,您可以相对准确地了解目前有多少人正在使用该网站。

      2: Constant polling

由于必须使用Ajax更新服务器,因此实现起来有点复杂。否则它的工作方式与#1类似。

每当用户在页面上时,您可以保持websocket打开或每隔N秒向服务器执行ajax请求。

通过这种方式,您可以很好地了解当前有多少人在您的网站上打开了网页,但是如果用户在浏览器中打开网页并且没有执行任何操作,则仍会将其视为在线

对该想法的略微修改是在客户端上使用脚本来监视鼠标移动。如果用户没有在页面上移动鼠标10分钟,则会停止轮询或断开websocket。这将解决显示闲置用户在线的问题。