Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环通过所有服务器';PHP中的s会话_Php_Session - Fatal编程技术网

循环通过所有服务器';PHP中的s会话

循环通过所有服务器';PHP中的s会话,php,session,Php,Session,在PHP中有没有一种方法可以获取服务器上所有会话(以及每个会话中的变量)的列表 基本上,我们有一个维护功能,需要知道哪些用户当前登录到该网站。我们已经将每个用户的数据存储在一个会话变量中,但我希望我可以循环使用这些会话中的每一个,并提取出我需要的数据 我的PHP非常有限(我通常是一名.Net开发人员),但如果有人知道这是否可能(以及如何做到),我将非常感激。我在谷歌上搜索了一下,结果显示这是不可能的,但我觉得这很难接受 尽管如此,如果你不能,你也不能,但我想我在StackOverflow上的朋友

在PHP中有没有一种方法可以获取服务器上所有会话(以及每个会话中的变量)的列表

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

我的PHP非常有限(我通常是一名.Net开发人员),但如果有人知道这是否可能(以及如何做到),我将非常感激。我在谷歌上搜索了一下,结果显示这是不可能的,但我觉得这很难接受


尽管如此,如果你不能,你也不能,但我想我在StackOverflow上的朋友可以给我一个明确的答案

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

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

作为其内容,并在浏览器中打开该文件

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

会话数据在存储到磁盘之前被序列化。因此,存储在会话文件中的对象在可用之前必须进行反序列化。但是,如果您使用纯文本(按原样存储)来存储会话数据(例如,
$\u session['userid']=1234
)来存储有关用户的信息,那么从文件中解析您正在查找的数据应该很容易

还有一件事。。。我没有研究过它,但是它看起来好像出现在文件名中的会话ID直接对应于,例如,存储在用户计算机上的PHPSESSID cookie的名称。因此,考虑到这一点,可以循环浏览临时会话目录中的文件,获取所有$SESSIONID值,使用
session\u ID($SESSIONID)
设置当前会话ID,使用
session\u start()启动会话
并通过PHP访问所需的数据,而无需解析内容文件本身。有人能证实这是否可行吗


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

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

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

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

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

从url响应时忽略Set Cookie标头: mysite.com/admin/ajax/main_ajax。Cookie长度应小于 大于或等于4096个字符


解决方案是在
session\u start()
之后立即添加
header\u remove(“Set Cookie”)

值得一提的是,这种黑客行为是个可怕的主意。PHP有“不共享”的体系结构,试图破解它就像使用螺丝刀钉一样。不要解析serwer内部文件,而是创建自己的文件,或者更好地使用数据库来持久化所需的内容。php可以选择将会话数据保存在内存中。我们并不总是可以从文件中取出它们。而且,这些“ses_*”文件可以放在多级目录结构下。这就是php.net中所说的,您是否也能检测出其中哪些是活动atm?最后,找到这个答案花了太长时间。谢谢虽然这会显示所有会话,但也会将您设置为登录到最后一个可见会话。有没有办法恢复用户当前会话(特别是“未登录”会话)?@user1274820您只需要执行
$originalSession=session_id()之前和
会话id($originalSession);会话_start()之后。这将恢复原始会话。