我可以统计会话以确定在线人数吗?

时间:2012-08-14 11:38:51

标签: php mysql session

我对某事感到困惑。当我尝试搜索如何计算PHP中的在线用户时,所有答案都与MySQL有很多不同的方式。

在我的脚本中,任何提交登录表单的用户都会创建$ _SESSION ['$ nickname']

所以我想,我可以用count来计算登录会话($ _ SESSION ['$ nickname']);并在我的页面中显示它?

或者这完全是错误的逻辑?

4 个答案:

答案 0 :(得分:4)

首先,你必须定义什么"在线"手段。 用户是否应该在最近5分钟内点击链接?

我假设您的数据库中已有一个用户表。 所以最简单的方法是添加一个新列,例如lastAction TIMESTAMP

当用户点击您网页上的链接时,您的脚本应该更新此值。

在您的统计信息页面或其他任何内容中,您可以获得包含该代码的在线用户的数量:

SELECT COUNT(*) FROM users WHERE lastAction > (NOW() - 60*5)

答案 1 :(得分:4)

完全错误的逻辑。 $ _SESSION是每用户的事情。一个用户的会话不与任何其他用户的会话共享。想一想 - 用PHP编写的在线银行,所有人共享一个$ _SESSION - 每个人都会看到每个人的帐户详细信息。

假设您使用的是基于PHP文件的标准会话,您可以将会话文件计算在它们存储的任何目录中,例如。

$users = count(glob(session_save_path() . '/*'));

请注意,这只会计算会话文件 - 它无疑会包含尚未进行垃圾回收的陈旧/死亡会话。如果你想要一个真正的“现在真的在线”,你必须解析每个会话文件并检查其内容。

答案 2 :(得分:3)

PHP在会话存储方面非常灵活,您可以定义自己的会话保存/恢复处理程序。

但是,默认会话存储为files,其中每个会话都单独存储到磁盘。这意味着,为了找出有多少用户“在线”(这里,我假设“在线=会话存在$_SESSION['$nickname']设置”) ,您需要打开存储在磁盘上的所有会话文件,并检查其中存在多少个唯一的昵称。这在时间和所需资源方面都非常沉重。

因此,大多数教程都建议在数据库中对此进行计数,方法是维护每个用户最后看到的时间戳(并检查最近X分钟内最后一次看到的用户数)。

如果您希望合并,可以通过定义自己的会话保存处理程序来将会话信息存储在数据库中......


关于会话的其他几点说明:

  • 关闭浏览器时不会立即销毁会话。实际上,浏览器不会以任何方式告诉服务器它正在被关闭。这意味着服务器应该提供一些基于时间的算法来决定谁在线以及谁不在线。
  • 会话彼此隔离,因此$_SESSION["foo"]无法由多个不同的会话共享 - 在PHP中没有等同于Global.asa。没有开箱即用。

答案 3 :(得分:0)

这是错误的逻辑,并且会话仅在最终用户的PC上本地存储并立即销毁,因此如果没有用户执行某些操作,则无法从服务器读取任何类型的确认。服务器端会话仅在垃圾清理时销毁。

最好的办法是为每个用户设置一个时间戳,每当用户做任何事情时都会更新。这意味着您需要通过JS / AJAX,PHP触发此更新。然后,您可以查看过去5分钟内有多少时间戳,例如,这可以让您大致了解目前有多少用户在线。

您还可以拥有一个隐藏的iframe,每隔几秒钟不断刷新并更新时间戳,或者JS / AJAX每隔X秒更新一次时间戳...