我是 PHP 的初学者,我正在为我的网站编写一些代码。我想获得在那一刻处于活动状态的会话总数。我知道这是一项艰巨的任务,但有可能。我该怎么做?
我用谷歌搜索过,有人说可以通过计算临时目录中临时会话文件的总数来实现。但是,它位于何处?
为了更好地解释,请考虑 Joomla 后端的示例,该示例显示当前访问者和管理员的总数,如下所示:
我是 PHP 的初学者,我正在为我的网站编写一些代码。我想获得在那一刻处于活动状态的会话总数。我知道这是一项艰巨的任务,但有可能。我该怎么做?
我用谷歌搜索过,有人说可以通过计算临时目录中临时会话文件的总数来实现。但是,它位于何处?
为了更好地解释,请考虑 Joomla 后端的示例,该示例显示当前访问者和管理员的总数,如下所示:
我正在改进@user2067005 的答案。您实际上需要从计数中减去 2,因为还scandir
报告了.
和..
条目。
$number_of_users = count(scandir(ini_get("session.save_path"))) - 2;
所有允许您显示访问者数量的网站都使用数据库会话处理程序(它可以是 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
表格:
此时,您可以使用简单的 sql 查询来获取所有访问者的数量:
SELECT
COUNT(`user_id`) AS users,
(COUNT(*) - COUNT(`user_id`)) as guests
FROM
`sessions`
WHERE
`last_seen` >= DATE_SUB(NOW(), INTERVAL 15 MINUTE)
这将计算一次打开的会话数量。
$number_of_users = count(scandir(ini_get("session.save_path")));
是的,我们可以扫描temp/
文件夹或会话存储文件夹以查找所有会话文件,但即使在会话销毁会话存储文件夹包含已注销用户的会话文件后,session.save_path
有时也无法确保正确的结果。session_destroy()
在这种情况下,你会得到错误的结果。而且,如果您启动phpmyadmin(MySQL)
它,它将创建一个它自己的会话文件。
如果您添加/拥有一个用于统计分析的 mysql 表,该表至少具有 ip 地址和时间列,即使您的站点没有会员活动,该表也将由访问者的点击填充。
在您的每个页面中,将 ip 和 time 插入此表。
然后,您可以获取最多 15 分钟前单击的不同 IP 地址。持续时间与您的内容密切相关,甚至可能是 10 秒或 1 小时。问问自己,如果你是你的访客,你会在你的网站上浏览多少,当然要诚实:)
最后,你的桌子会在一段时间后变胖。确定删除无用行的频率、逻辑和方法。根据您的网站流量和来源,在每次到达频率时清理表格。