我对某事感到困惑。当我尝试搜索如何在 PHP 中计算在线用户时,所有答案都与 MySQL 和许多不同的方式相关。
在我的脚本中,任何提交登录表单的用户都会创建一个 $_SESSION['$nickname']
所以我想,我可以用 count($_SESSION['$nickname']); 来计算登录会话数吗?并将其显示在我的页面中?
或者这完全是一个错误的逻辑?
首先,您必须定义“在线”的含义。用户是否应该在过去 5 分钟内点击了链接?
我假设您的数据库中已经有一个用户表。所以最简单的方法是添加一个新列,例如lastAction TIMESTAMP
.
当用户点击你页面上的链接时,你的脚本应该更新这个值。
在您的统计页面或其他页面上,您可以使用该代码获得在线用户的数量:
SELECT COUNT(*) FROM users WHERE lastAction > (NOW() - 60*5)
完全错误的逻辑。$_SESSION 是每个用户的事情。一个用户的会话不与任何其他用户的会话共享。想想看 - 一个用 PHP 编写的在线银行,都共享一个 $_SESSION - 每个人都会看到每个人的帐户详细信息。
假设您使用的是标准的基于 PHP 文件的会话,您可以在它们存储的任何目录中计算会话文件,例如
$users = count(glob(session_save_path() . '/*'));
请注意,这仅计算会话文件 - 它无疑会包含尚未被垃圾收集的陈旧/死会话。如果您想要一个实际的“现在真的在线”,您必须解析每个会话文件并检查其内容。
PHP 在会话存储方面非常灵活,您可以定义自己的会话保存/恢复处理程序。
但是,默认会话存储是files
,其中每个会话单独存储到磁盘。这意味着,为了找出有多少用户有“在线”(这里,我假设“在线=会话存在$_SESSION['$nickname']
set ”),您需要打开存储在磁盘上的所有会话文件,并检查有多少唯一昵称存在于其中。这在时间和所需资源方面都非常繁重。
因此,大多数教程建议通过维护每个用户的最后一次看到的时间戳(并检查有多少用户在最后 X 分钟内最后一次看到)来在数据库中计算这一点。
如果您希望合并,可以通过定义您自己的会话保存处理程序来将会话信息存储在数据库中来实现...
关于会话的一些附加说明:
$_SESSION["foo"]
不能由多个不同的会话共享 -Global.asa
在 PHP 中没有等价物。不是开箱即用。这是错误的逻辑,会话仅在最终用户的 PC 上本地存储并立即销毁,因此如果用户不做任何事情,就无法从服务器读取它以进行任何确认。服务器端会话仅在垃圾清理时被销毁。
您最好的选择是为每个用户设置一个时间戳,每当用户执行任何操作时都会更新该时间戳。这意味着您需要通过 JS/AJAX、PHP 触发此更新。然后,您可以查看最近 5 分钟内有多少时间戳,这可以让您大致了解当前有多少用户在线。
您还可以有一个隐藏的 iframe,它每隔几秒不断刷新并更新时间戳,或者 JS/AJAX 也每 X 秒更新一次时间戳......