在 PHP 中遍历服务器的所有会话

2022-08-30 10:38:35

在 PHP 中,有没有办法获取服务器上所有会话(以及每个会话中的变量)的列表?

基本上,我们有一个维护功能,需要知道哪些用户当前登录到该网站。我们已经将每个用户的数据存储在会话变量中,但我希望我可以遍历每个会话并提取所需的数据。

我的PHP非常有限(我是一个.Net开发人员),但如果有人知道这是否可能(以及如何做到这一点),我将不胜感激。我用谷歌搜索了这个,我发现的结果倾向于暗示这是不可能的,但我发现这很难接受。

不过,如果你不能,你不能,但我认为我在StackOverflow上的伙伴们可以给我一个明确的答案!


答案 1

PHP 将每个用户的会话数据存储在服务器上的临时文件夹中。此文件夹在 php.ini 配置文件中的变量 session.save_path 下定义。从 php.ini 文件中找到此值,或者使用以下命令创建一个 php 文件:

<?php echo "Session Save Path: " . ini_get( 'session.save_path');?>

因为它是内容,然后在浏览器中打开该文件。

找到会话数据的保存路径后,打开该文件夹,您会注意到一个相当简单的结构。所有会话都以以下格式存储:sess_$SESSIONID 。

会话数据在存储在磁盘上之前会进行序列化。因此,存储在会话文件中的对象必须先反序列化才能使用。但是,如果您使用按原样存储的纯文本来存储会话数据(例如)以存储有关用户的信息,那么从文件中解析出要查找的数据应该足够容易。$_SESSION['userid'] = 1234

还有一件事...我还没有研究过它,但它似乎出现在文件名中的会话ID直接对应于例如存储在用户计算机上的PHPSESSID cookie的名称。因此,考虑到这一点,可以遍历临时会话目录中的文件,获取所有$SESSIONID值,使用设置当前会话ID,启动会话并通过PHP访问所需的数据,而无需解析内容文件本身。谁能确认这是否可能?session_id($SESSIONID)session_start()

编辑:调整了帖子以匹配Itay的评论。


答案 2

这将为您提供所有会话的数据,存储在数组中并按会话ID编制索引:

<?php
$allSessions = [];
$sessionNames = scandir(session_save_path());

foreach($sessionNames as $sessionName) {
    $sessionName = str_replace("sess_","",$sessionName);
    if(strpos($sessionName,".") === false) { //This skips temp files that aren't sessions
        session_id($sessionName);
        session_start();
        $allSessions[$sessionName] = $_SESSION;
        session_abort();
    }
}
print_r($allSessions);

推荐