English 中文(简体)
在PHP中循环遍历服务器的所有会话
原标题:
  • 时间:2009-03-24 01:59:40
  •  标签:

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

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

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

然而,如果您无法做到,那么您就无法做到,但我认为我的堆栈溢出网站的伙伴们可以给我一个明确的答案!

最佳回答

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值,使用session_id($SESSIONID)设置当前会话ID,使用session_start()启动会话,并通过PHP访问所需的数据,而无需分析文件本身的内容。有人可以确认这是否可能吗?

编辑:根据Itay的评论进行了调整。

问题回答

这将为您获取存储在数组中并由会话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);

以下是通过储存的文件获取会话列表的更简洁的方法:

<?php
print_r(scandir(session_save_path()));
?>

我在ajax调用中使用了@mgroat的方法,但是HTTP响应头中存在问题,Set-Cookie头多次出现,并且jQuery报告了一个错误:

Set-Cookie header is ignored in response from url: mysite.com/admin/ajax/main_ajax. Cookie length should be less than or equal to 4096 characters.

解决方案是在session_start()之后立即添加header_remove("Set-Cookie")





相关问题
热门标签