2011-05-13 60 views
5

不可能在PHP SESSIONS中获得所有session_id的列表?获取所有PHP会话列表session_id

注: 我需要在服务器中维护一些文件。一个文件等于一个会话。如果SESSION过期,我需要确定旧文件的行为。


谢谢大家的任何建议。

+3

我不认为有 - 你必须在创建时手动跟踪它们。你需要做什么? – 2011-05-13 11:50:20

+0

我创建混搭Web应用程序,我需要插入一个图像到Flickr在'canvas'中的会话。但是'canvas'不能使用来自远程服务器的图像。所以我用PHP在本地保存,然后使用。但当然,我需要清理临时文件夹 - 如果会话过期文件不是必需的。因此,如果创建新会话,我会检查临时是否仅包含图像平等ID活动会话。 – LukasSvihel 2011-05-13 12:55:51

回答

1

我想在一个旧项目中做到这一点。

我命名的文件与SESSION_ID(是这样的:sessionid_some_file.tmp):

_TMP_PATH_:路径,其中要检查的文件是。

foreach(new DirectoryIterator(_TMP_PATH_) as $file) 
{ 
    if(preg_match('/(.*)_(.*)_(.*)\.tmp/', $file->getFilename(), $data)) 
    { 
     session_write_close(); 
     $session_id = $data[1]; 
     session_id($session_id); 
     session_start(); 
     if(empty($_SESSION)) 
     { 
      unlink(_TMP_PATH_ . $file->getFilename()); 
     } 
    } 
} 
session_write_close(); 

foreach文件我得到session_id,打开它并测试内部是否有东西。 (我在每个会话打开后写了一些东西)

但是要小心,这段代码从来没有进入生产环境。

+0

谢谢 - 为我修改这项工作。 – LukasSvihel 2011-05-13 16:13:38

2

你能做到让所有现有会话ID列表的最好的是:

preg_grep("/^sess_/", scandir(ini_get("session.save_path"))) 

但是不会告诉你哪些文件仍然有效。我真的不明白你的问题的第二部分。但是可以手动将它们反序列化以探测属性。

+0

此代码不起作用。我是否回应 - 对吗? 'echo $ temp = preg_grep(“/^sess_ /”,scandir(ini_get(“session.save_path”))); echo $ temp [0];' – LukasSvihel 2011-05-13 13:53:29

+1

'print_r()'在数组上效果更好。 – mario 2011-05-13 13:55:52

+0

谢谢。现在它是打印信息。 – LukasSvihel 2011-05-13 14:33:49

3

正如其他人所回答的,会话存储在session.save_path定义的路径php.ini中,您可以迭代此目录以检索每个会话的列表。

替代方法将更改会话存储并使用session_set_save_handler()将其移动到数据库。您可以将所有会话存储在数据库中,并根据需要进行处理。

+0

这个好主意,但我不能改变'php.ini'和'session.save_path'默认设置为'/ dev/shm'不存在的路径:( – LukasSvihel 2011-05-13 13:45:39