【问题标题】:delete session files after a time from creation在创建一段时间后删除会话文件
【发布时间】:2010-01-24 04:35:15
【问题描述】:

我将会话保存在 /temp 目录的另一个目录中。 说/session目录。(使用session_save_path("session")

此外,还有一个代码可以在创建和注销 10 分钟后终止会话。

但我提到如果用户登录并关闭他的计算机,我的注销和会话销毁代码不会运行,因此会话文件将保留在会话目录中。

我想知道有没有办法在创建一段时间后删除/session 中的会话文件?

我用了这个代码

  if ($handle = opendir('sessions')) {

    while (false !== ($file = readdir($handle))) {
        if (filectime($file)< (time()-600)) {  // 600 = 10*60
        unlink($file);
        }
    }
  }

但是,不起作用,我认为它无法通过filectime($file)获得创建时间

谢谢

【问题讨论】:

    标签: php session automation


    【解决方案1】:

    你不应该需要那个。 PHP 本身实现了一种垃圾回收机制来删除失效的会话文件。它将比您使用 PHP 自己编写的任何其他方法更有效。

    查看 PHP 的session.gc_* 配置选项了解更多信息。

    【讨论】:

    • 它似乎只适用于 /tmp 目录中的会话我在那里有 4 个会话文件(我自己的会话目录),从 4 天前开始仍然存在!
    • 我很确定它适用于您当前的会话路径。请记住,每次运行脚本时 GC 机制实际上启动的可能性很小,以避免过多的开销。默认情况下,每次使用会话访问脚本时都有 1% 的机会。
    • 那么,如何将“session.gc_probability”更改为 100(默认为 1)
    • @safaali - 这根本不是正确的解决方案。导致垃圾收集器在 每个 会话获取上运行会增加很多开销。为什么不简单地将expiryTime 存储为会话信息的一部分,并在开始会话时检查它?如果它太旧,您可以使用session_destroy() 明确销毁它并重新开始一个新会话。
    【解决方案2】:

    谢谢,但我想我可以自己解决

    解决方法很简单

      if ($handle = opendir('sessions')) {
    
      foreach (glob("sessions/sess_*") as $filename) {
        if (filemtime($filename) + 400 < time()) {
          @unlink($filename);
        }
      }
    
      }
    

    【讨论】:

      【解决方案3】:

      我之前使用 cron 作业完成了这项工作,该作业进入并删除了早于 X 的会话文件(由于某种原因,PHP 的自动清理没有完成这项工作)。不幸的是,如果这是在无法让您设置 cron 作业的托管主机上,那么您可能不会有这样的选择。

      【讨论】:

        【解决方案4】:
        // Delete old sessions
          if (substr(ini_get('session.save_path'), 0, 4) != '/tmp') {
            foreach (glob(rtrim(ini_get('session.save_path'), '/') .'/sess_*') as $filename) {
              if (filemtime($filename) + ini_get('session.gc_maxlifetime') < time()) {
                @unlink($filename);
              }
            }
          }
        

        【讨论】:

          【解决方案5】:
          // get the session files directory
          $dir = session_save_path("session");
          
          //clear cache
          clearstatcache();
          
          // Open a directory, and read its contents
          
          if (is_dir($dir)){
          
            // we iterate through entire directory
            if ($dh = opendir($dir)){
            while (($file = readdir($dh)) !== false){
          
              //get the last acces date of each file
              @$time_stamp=fileatime($file);
          
              //check if it is older than... 600, and assign a text flag: with value "to delete" (when old enough) or "---" (when young enough)
              $to_delete = ($time_stamp<time()-600) ? 'to delete!' : '---';
          
              //format acces date to a human readible format
              @$date = date("F d Y H:i:s.",fileatime($file));
          
              //output stats on the screen
              echo "file:" . $file . "Last access: ".$date.", ".$to_delete."<br>";
          
              //INFO
              //depending on wishes, you can modify flow of the script using variables
              // particulary useful is $to_delete  -> you can easily covert it to true/false format
              //to control the scrip
            }
          
            closedir($dh);
            }
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-08-12
            • 1970-01-01
            • 2011-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多