在线或离线功能PHP

3
我正在开发一个"社区",当然,我希望能够知道用户是在线还是离线。我创建了一个表,在用户登录时将一行数据的值更新为1(默认为0),这样他们就在线了。当他们登出时,他们就离线了。但是如果他们不点击“登出”按钮,则会一直在线,直到按下该按钮为止。
因此,我想要实现的是:
  • 在5分钟不活动之后,我的数据库中的行应更新为0。
我想要的是最简单的方法。我是否应该在每次加载页面时都使用mysql_query来更新一行数据的值为1?还是有其他方法可以做到这一点?

你还需要考虑到有人停留在同一页超过5分钟的情况。我建议设置一个Ajax请求,每隔几分钟向服务器发送一次请求。 - Chris Laplante
@SimpleCoder 我以前没有使用过Ajax。所以我不知道如何做这个。但是我知道你的意思。同一页上的某个人停留5分钟被转为离线状态是不公平的;) - skolind
最好记录用户的活动,例如通过在表中更新/插入记录并指定一个时间间隔(比如15分钟),以便将用户视为在线。当您想要检查用户是否在线时,只需检查他最后一次活动记录,看看它是不是在15 <interval>分钟前或更短的时间内。 - Tom Knapen
@Kolind:使用jQuery进行ajax非常容易,只需执行jQuery.ajax('/useralivepage.php?name=abc'),页面就会被调用。在php中填充名称即可。 - Daniel
5个回答

7

使用DateTime代替布尔型的“在线”字段。当用户请求页面时,将DateTime更新为NOW()。在获取当前在线用户列表时,您的WHERE子句将类似于WHERE lastSeen > DATE_SUB(NOW(), INTERVAL 5分钟)

更新:检索个人在线状态。

select if(lastSeen > date_sub(now(), interval 15 minutes), 1, 0) as status from table where userid=$userid


2
如果用户去拿咖啡,20分钟后回来怎么办?他会被断开连接吗? - Madara's Ghost
1
@Riduko的请求:在5分钟不活动后,我的数据库中的行应该更新为0。这就是正确的行为。 - J0HN
@kolind 是的,您需要在每个页面请求上执行 update onlineTable set lastSeen = now() where userid=$userid。将此查询放入标题或包含文件中。 - AndrewR
1
优化提示:如果您为在线/离线数据创建一个单独的表,请将其设置为MEMORY表。 - piotrp
@AndrewR 再次问候。希望你正在关注。我正在使用这种方法。但现在我需要创建一个功能,如果用户在线,应该显示绿色图片,否则显示红色图片(我当然有这些图片)。你会怎么做呢?以前我只是用:if($row['status']==0) 如果不是,则使用红色图片。但现在我不能这样做。 - skolind
显示剩余4条评论


0

如果您不想设置一个每5分钟执行一次代码的cron job,那么您就没有其他选择了。但是,实际上,我认为以下方法会更有效:

  1. 将您的1/0列更改为timestamp
  2. 在每个用户请求时,将该timestamp更新为当前日期时间。
  3. 在检查活跃用户时,检查该timestamp是否比now早5分钟

这样,您将拥有有关用户的实际数据,而无需重复查询 - 每个请求只需要一个额外的更新即可。


0
如果只在页面加载时更新行,则某些信息将不正确。 假设用户已经打开页面并正在写非常长的文本或其他内容。他已经这样做了半小时。现在你的数据库已经更新,他被计算为离线用户。
我会编写JavaScript代码来每5分钟向您发送ping请求,如果打开的选项卡处于活动状态。 此ping将更新数据库字段“last_activity”为NOW()。要计算在线用户或检查用户是否在线,您需要将“last_activity”与NOW()减去五分钟进行比较。

JavaScript需要知道用户是否正在与页面进行交互。否则,如果你只是有一个每5分钟向服务器发送请求的JavaScript,那么在浏览器中打开的页面将继续显示你在线。 - AndrewR

0

我认为最简单的方法是:

  • 您可以在session_save_path()目录中计算会话。
  • 您可以将上次访问时间戳存储在数据库中,并使用(timestamp > current_timestamp - somedelay)计算行数。

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