我正在创建一个上传功能,该功能使用用户的session-id作为名称在服务器上存储用户上传的文件。现在,我想将此文件保留在服务器上,直到该会话处于活动状态。
所以,我的问题是,如何从session-id确定会话是活动还是已过期,以便在以后的情况下我可以安全地删除用户上传的文件。
我希望以特定的间隔进行清理,可能是通过使用cron作业,但我以前从未使用过它。
答案 0 :(得分:2)
您不能仅仅依赖session.gc_maxlifetime,因为在此时间之后会话被标记为垃圾并且垃圾收集器默认情况下启动的概率为1%(session.gc_probability)。
更好的方法是IMHO处理你的过期数据。
您可以例如开始时间并将其保存到会话变量中:
<?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();
}
?>
未经测试......只是一个想法
答案 1 :(得分:2)
我正在尝试做同样的事情。一种解决方案是使用session_set_save_handler()
定义自定义垃圾收集器功能。在此自定义功能中,您将删除与会话关联的上载文件,然后从磁盘中删除会话。我看到的唯一问题是你必须定义其余的会话处理程序:
bool session_set_save_handler ( callback $open,
callback $close,
callback $read,
callback $write,
callback $destroy,
callback $gc )
如果您不依赖PHP来处理会话,这很容易。有没有办法从自定义处理函数调用PHP的默认处理函数?
答案 2 :(得分:0)
间隔可以像这样 - 有人打开你的网络 - &gt; php脚本正在运行 - &gt;它检查文件是否是时间 - &gt;删除时间文件
不需要CRON: - )
如果用户关闭或不关闭浏览器窗口(如果他没有关闭它但是打开睡眠模式并在2天内回来 - 会话仍然是活动的AFAIK),则几乎不可能确定由于缺少信息 - 只想以最佳方式解决这个问题,这是使用自己的会话引擎和AJAX检查。