【问题标题】:Find out if a session with a particular id has expired查看具有特定 ID 的会话是否已过期
【发布时间】:2011-07-07 08:21:08
【问题描述】:

我正在创建一个上传功能,它将用户上传的文件以用户的会话 ID 作为其名称存储在服务器上。现在,我想将此文件保留在服务器上,直到该会话处于活动状态。

所以,我的问题是,我如何从 session-id 确定会话是活动的还是过期的,以便在以后的情况下我可以安全地删除用户上传的文件。

虽然我以前从未使用过它,但我想在特定的时间间隔通过使用 cron 作业来进行清理。

【问题讨论】:

  • 据我所知,删除过期会话是网络服务器的工作,所以也许你可以加入这个机制?
  • @Mchl 是的,您说得对,删除过期会话是服务器的工作,但我不想这样做。如果他的会话过期,我想删除用户上传的文件,否则会有很多不需要的文件占用我的服务器空间。

标签: php session cakephp cron


【解决方案1】:

您不能只依赖 session.gc_maxlifetime,因为在此之后会话被标记为垃圾,并且垃圾收集器默认仅以 1% 的概率启动 (session.gc_probability)。

恕我直言,更好的方法是自行处理过期数据。

例如,您可以启动时间并将其保存到会话变量中:

<?php $_SESSION['last_seen'] = time();//Update this value on each user interaction. ?>

稍后..通过 cron 你可以这样做:

<?php
//Get the session id from file name and store it into the $sid variable;
session_id($sid);//try to resume the old session
session_start();
if (isset($_SESSION['last_seen']) && $_SESSION['last_seen'] > $timeout){//Session is expired
  //delete file
  session_destroy();
}else if (!isset($_SESSION['last_seen')){ //already garbaged
  //delete  file
  session_destroy();
}
?>

未测试...只是一个想法

【讨论】:

    【解决方案2】:

    我正在尝试做同样的事情。一种解决方案是使用session_set_save_handler() 定义自定义垃圾收集器函数。在此自定义函数中,您将删除与会话关联的上传文件,然后从磁盘中删除会话。我看到的唯一问题是您还必须定义其余的会话处理程序:

    bool session_set_save_handler ( callback $open, 
                                    callback $close, 
                                    callback $read, 
                                    callback $write, 
                                    callback $destroy, 
                                    callback $gc )
    

    如果您不依赖 PHP 来处理会话,这很容易。有没有办法从自定义处理函数调用 PHP 的默认处理函数?

    【讨论】:

      【解决方案3】:

      可以这样设置间隔 - 有人打开你的网站 -> php 脚本正在运行 -> 它检查文件是否超时 -> 删除超时文件

      而且不需要 CRON :-)

      由于缺乏信息,几乎不可能确定用户是否关闭了浏览器窗口(如果他没有关闭它但打开睡眠模式并在 2 天内返回 - 会话仍然处于活动状态 AFAIK) - 以最好的方式解决这个问题的唯一想法是使用自己的会话引擎和 AJAX 检查。

      【讨论】:

      • 这是一个远离 cron 的好技巧 :) 但应该有办法知道会话是否已过期,可能是通过浏览会话文件。将其创建日期与经过的时间进行比较。
      • 测试文件超时不是更简单吗?并将最后一次访问存储在会话中,仅用于终止较旧的会话(是的,可以将一个会话保留 2 天)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      相关资源
      最近更新 更多