我想从localhost获取会话列表。所以我写了
session_start();
print_r($_SESSION);
目前访问者是两个人。另一个是来自另一台PC,最后一个是托管pc。但是只显示托管的pc会话。实际上我想得到所有会话用户列表。
答案 0 :(得分:12)
使用以下代码可以轻松完成此操作:
<?php
$sessions = array();
$path = realpath(session_save_path());
$files = array_diff(scandir($path), array('.', '..'));
foreach ($files as $file)
{
$sessions[$file] = unserialize(file_get_contents($path . '/' . $file));
}
echo '<pre>';
print_r($sessions);
echo '</pre>';
?>
确保您了解执行(或允许)此操作的风险。
答案 1 :(得分:4)
会话彼此隔离。一个用户的会话无权访问另一个用户的会话。变量$_SESSION
仅引用当前用户的会话。
我认为没有办法访问不同用户的会话,除了找出会话文件在磁盘上的物理存储位置并手动解析它们。 请注意,这并不是您想要做的事情。
答案 2 :(得分:1)
我不确定你在问什么,但我认为你正在寻找另一个用户的另一个会话。如果是这种情况,那么我不推荐它,这是不可能的。会话对每个浏览器会话都是独立的(除非通过cookie另行指定)。
如果您要求从自己的用户从另一台计算机检索会话,那么再次,默认会话行为并不是真的要做到这一点。您需要实现自己的会话管理器,该管理器可能使用数据库并跟踪哪个用户的会话(可能是用户ID),以便可以将其加载到另一台计算机上。我不建议这样做,因为你说你正在进入另一个完整的蜡球。
如果您尝试跟踪用户登录和计算机之间的数据,我建议您使用用户设置表。在这里,您可以跟踪用户拥有的设置,并在每个会话甚至每个页面加载时加载它们,而无需修改会话处理程序。
如果您想从标题中获取当前活动会话的列表,则只需记录表中每个用户的最后一次点击时间并显示该数据,并在您认为会话处于非活动状态时设置一段时间。
答案 3 :(得分:1)
只要您知道要处理的会话的标识符,就可以这样做。这是一个具体的例子:
<?php
// Getting your own session id
$currentSessionId = session_id();
// Closing your own session
session_write_close();
// Switch to the session to handle
// Here, it is assumed that you pulled the session ID from a storage
session_id($sessionId);
session_start();
// Do whatever you want with the session ...
// Close the session once you finished to work with it
session_write_close();
// Restoring your own session session
session_id($currentSessionId);
session_start();
// At this point, you're back in your own session
答案 4 :(得分:0)
从session_save_path获取“ses_ *”文件是一个选项,但如果这些会话文件处于多级别:http://www.php.net/manual/en/session.configuration.php#ini.session.save-path 可能会出现问题。
最好是在每个session_start()之后,更新一个mysql表,其中第一列是session_id(),第二列是$ _SESSION的序列化数据