检查PHP session_id是否正在使用中

时间:2011-06-01 19:59:39

标签: php sessionid

我正在构建一个网络应用程序,用户可以通过网络应用程序界面上传某些文件并对其进行处理。我需要将这些文件存储为用户会话的长度。我正在为每个用户创建一个文件夹,使用session_id作为文件夹名称并将文件存储在那里。

问题:没有任何迹象表明用户离开了我的网站,会话就不再使用了。我需要一个清理脚本,该脚本获取每个文件夹的名称并检查session_id是否仍处于活动状态,以便删除未使用且现在无法访问的文件夹。我怎么能这样做?

4 个答案:

答案 0 :(得分:7)

我遇到了同样的问题。我的解决方案是检查会话文件:

<?php
// clean-up script.  Get cron/windows task scheduler to run this every hour or so

// this is the path where PHP saves session files
$session_path = ini_get('session.save_path');

// this is the directory where you have created your folders that named after the session_id:
$session_files_dir = '/path/to/your/save/dir';

// loop through all sub-directories in the above folder to get all session ids with saved files:

if ($handle = opendir($session_files_dir)) {

    while (false !== ($file = readdir($handle))) {

        // ignore the pseudo-entries:
        if ($file != '.' && $file != '..') {

            // check whether php has cleaned up the session file
            if (  file_exists("$session_path/sess_$file")  ) {
                // session is still alive
            } else {
                // session has expired
                // do your own garbage collection here
            }

        }
    }

    closedir($handle);
}

?>

请注意,这假设session.save_handler ini设置设置为"files"session.save_path设置没有目录级前缀(即与正则表达式{{1}不匹配并且启用了php的自动会话垃圾收集。如果上述任何一个假设都不正确,那么你应该实现手动会话垃圾收集,所以可以添加你的清理代码。

这也假设/^\d+;/中的唯一文件是您的每个会话文件夹,并且它们都以其关联的session_id命名。

答案 1 :(得分:1)

您遇到的问题基本上是在获得自定义会话文件目录时出现的相同问题(在较不复杂的级别上)。你也需要自己清理它。该过程也称为垃圾收集。

这通常通过在服务器端运行检查过期会话文件的清洁工作来完成,或者在您的示例中检查过期会话目录(这可以是一个cron作业)。

这是它的工作原理:

大多数文件系统存储文件的创建和上次访问日期。因此,如果会话超时,则X小时内不再使用它。因此,您可以放心地假设,如果在过去X小时内未访问会话文件,则会话已停止,并且可以安全地删除所有比此时间“旧”的文件。

完成工作。对于您的目录,您可能希望在其中添加一个文件,您希望将其用作测试文件以跟踪访问时间。

php手册有一些例子:http://www.php.net/manual/en/session.configuration.php#ini.session.save-path(寻找mod_files.sh脚本)

答案 2 :(得分:1)

我觉得这很有帮助/我认为它解决了你的问题:

Best place to store large amounts of session data

答案 3 :(得分:0)

如果您有权访问服务器的crontab或计划任务,则可以创建一个仅允许在本地执行的php文件,该文件检查数据库中找到的所有会话的到期日期/时间值。每次用户更新此过期日期/时间值都将更新为其下一个超时值(+30分钟等)。

您的计划任务/ crontab会找到所有闲置的用户,并清理他们离开的混乱而不注销。我不建议让您的计划任务/ crontab运行得太频繁。至少让重复使用的时间间隔为几分钟,这对你的情况是有意义的。