查找活动会话的总数

时间:2013-06-23 09:07:13

标签: php session session-state

我是PHP的初学者,我正在为我的网站编写一些代码。我想获得当时活跃的会话总数。我知道这是一项艰巨的任务,但可能。我该怎么办?

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

有关更多解释,请考虑Joomla后端示例,其中显示了当前访问者和管理员的总数,如下所示:enter image description here

5 个答案:

答案 0 :(得分:3)

我正在改进@ user2067005的答案。您实际上需要从计数中扣除2,因为scandir也会报告...条目。

$number_of_users = count(scandir(ini_get("session.save_path"))) - 2;

答案 1 :(得分: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)

答案 2 :(得分:2)

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

$number_of_users = count(scandir(ini_get("session.save_path")));

答案 3 :(得分:1)

如果添加/拥有一个至少包含ip地址和时间列的统计分析的mysql表,即使您的站点没有成员资格活动,也会通过点击访问者来填充表格。

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

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

最后,你的餐桌会在一段时间后变胖。确定删除无用行的频率,逻辑和方法。每次到达您的频率时清洁桌子,这取决于您的网站流量和来源。

答案 4 :(得分:1)

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