在PHP中是否有办法获取服务器上所有会话(以及每个会话中的变量)的列表?
基本上,我们有一个维护功能,需要知道哪些用户当前登录到该站点。我们已经将每个用户的数据存储在会话变量中,但我希望我可以遍历每个会话并获取所需的数据。
我的PHP非常有限(我是一名.Net开发人员),但如果有人知道这是否可行(以及如何做),我将非常感激。我用谷歌搜索了这个,我发现的结果倾向于暗示它是不可能的,但我发现这很难接受。
尽管如此,如果你不能,你可以,但我认为我在StackOverflow上的好友可以给我一个明确的答案!
答案 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()
。