循环使用PHP中的所有服务器会话

时间:2009-03-24 01:59:41

标签: php session

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

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

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

尽管如此,如果你不能,你可以,但我认为我在StackOverflow上的好友可以给我一个明确的答案!

4 个答案:

答案 0 :(得分:42)

PHP将每个用户的会话数据存储在服务器上的临时文件夹中。此文件夹在变量session.save_path下的php.ini配置文件中定义。从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的评论。

答案 1 :(得分:7)

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

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

答案 2 :(得分:4)

这将为您提供所有会话的数据,存储在数组中并按会话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);

答案 3 :(得分:0)

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

  

Set-Cookie标头在url响应中被忽略:   mysite.com/admin/ajax/main_ajax。 Cookie长度应短一些   等于或等于4096个字符。

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