在PHP中循环遍历所有服务器的会话
有没有办法在PHP中获取服务器上的所有会话(以及每个会话中的variables)的列表?
基本上,我们有一个维护function,需要知道哪些用户当前login到网站。 我们已经将每个用户的数据存储在一个会话variables中,但是我希望能够循环这些会话中的每一个会话,并抽出我需要的数据。
我的PHP是非常有限的(我是一个.net开发人员),但如果有人知道这是甚至可能(以及如何做到这一点),我会非常感激。 我search了这个,我发现的结果倾向于说明这是不可能的,但我觉得这很难接受。
不过,如果你不能,但我认为我的朋友StackOverflow可以给我一个明确的答案!
PHP将每个用户的会话数据存储在服务器上的临时文件夹中。 这个文件夹是在variablessession.save_path下的php.iniconfiguration文件中定义的。 从你的php.ini文件中find这个值,或者用下面的方法创build一个php文件:
<?php echo "Session Save Path: " . ini_get( 'session.save_path');?>
因为它的内容,并在浏览器中打开文件。
一旦find会话数据的保存path,打开该文件夹,你会发现一个相当简单的结构。 所有会话都以sess_ $ SESSIONID格式存储。
会话数据在被存储到磁盘之前被序列化。 因此,存储在会话文件中的对象在被使用之前必须被反序列化。 但是,如果您使用原样存储的纯文本来存储会话数据(例如$_SESSION['userid'] = 1234
)来存储有关用户的信息,则应该很容易parsing您正在从文件中查找的数据。
还有一件事…我没有看过它,但似乎在文件名中出现的会话ID直接对应于,例如,存储在用户计算机上的PHPSESSID cookie的名称。 因此,考虑到这一点,可以循环访问临时会话目录中的文件,获取所有$ SESSIONID值,使用session_id($SESSIONID)
设置当前会话ID,使用session_id($SESSIONID)
启动会话并访问您需要的数据通过PHP,而不必分析内容文件本身。 任何人都可以确认这是否可能?
编辑:调整后的post,以配合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);