4

我是 PHP 的初学者,我正在为我的网站编写一些代码。我想获得在那一刻处于活动状态的会话总数。我知道这是一项艰巨的任务,但有可能。我该怎么做?

我用谷歌搜索过,有人说可以通过计算临时目录中临时会话文件的总数来实现。但是,它位于何处?

为了更好地解释,请考虑 Joomla 后端的示例,该示例显示当前访问者和管理员的总数,如下所示:在此处输入图像描述

4

5 回答 5

3

我正在改进@user2067005 的答案。您实际上需要从计数中减去 2,因为还scandir报告了...条目。

$number_of_users = count(scandir(ini_get("session.save_path"))) - 2;
于 2013-06-23T10:05:49.823 回答
3

所有允许您显示访问者数量的网站都使用数据库会话处理程序(它可以是 mysql db 甚至是 memcached)。

会话表结构:

CREATE TABLE `sessions` (
`id` INT NOT NULL ,
`session_id` VARCHAR( 32 ) NOT NULL ,
`user_id` INT NOT NULL ,
`last_seen` DATETIME NOT NULL
) ENGINE = InnoDB;

会话 ID可以是内置的 php 会话 ID,也可以是您自己的唯一哈希。内置会话的工作速度不是那么快,但您无需注意生成会话 ID、到期日期等。

用户 ID将是当前登录的用户 ID,如果他是访客,则为 NULL。

每次用户刷新页面时,您都应该更新您的session表格:

  • 如果数据库中已经存在会话,则更新 last_seen
  • 为每个没有添加的新访问者添加一个新行
  • 如果用户登录或注销,则更改 user_id 值
  • 删除过期会话

此时,您可以使用简单的 sql 查询来获取所有访问者的数量:

SELECT
    COUNT(`user_id`) AS users,
    (COUNT(*) - COUNT(`user_id`)) as guests
FROM
   `sessions`
WHERE
    `last_seen` >= DATE_SUB(NOW(), INTERVAL 15 MINUTE)
于 2013-06-23T10:13:01.823 回答
2

这将计算一次打开的会话数量。

$number_of_users = count(scandir(ini_get("session.save_path")));
于 2013-06-23T09:10:24.923 回答
2

是的,我们可以扫描temp/文件夹或会话存储文件夹以查找所有会话文件,但即使在会话销毁会话存储文件夹包含已注销用户的会话文件后,session.save_path有时也无法确保正确的结果。session_destroy()在这种情况下,你会得到错误的结果。而且,如果您启动phpmyadmin(MySQL)它,它将创建一个它自己的会话文件。

于 2017-08-08T09:16:05.037 回答
1

如果您添加/拥有一个用于统计分析的 mysql 表,该表至少具有 ip 地址和时间列,即使您的站点没有会员活动,该表也将由访问者的点击填充。

在您的每个页面中,将 ip 和 time 插入此表。

然后,您可以获取最多 15 分钟前单击的不同 IP 地址。持续时间与您的内容密切相关,甚至可能是 10 秒或 1 小时。问问自己,如果你是你的访客,你会在你的网站上浏览多少,当然要诚实:)

最后,你的桌子会在一段时间后变胖。确定删除无用行的频率、逻辑和方法。根据您的网站流量和来源,在每次到达频率时清理表格。

于 2016-06-08T17:13:16.960 回答