所以假设用户在我的网站上做了一些事情,例如上传了一些图片或其他什么,他没有注销就离开了,再也没有回来,或者说他确实在几个月后回来了。
所以我的问题是,是否有某种方法可以在会话过期后删除他上传的文件,比如说 30 分钟后(请记住,用户从未重新加载页面),所以这需要完全在服务器端运行完全没有用户干预。
编辑谢谢大家的精彩回答,它给了我很多好主意,我希望我能接受你所有的答案:)
所以假设用户在我的网站上做了一些事情,例如上传了一些图片或其他什么,他没有注销就离开了,再也没有回来,或者说他确实在几个月后回来了。
所以我的问题是,是否有某种方法可以在会话过期后删除他上传的文件,比如说 30 分钟后(请记住,用户从未重新加载页面),所以这需要完全在服务器端运行完全没有用户干预。
编辑谢谢大家的精彩回答,它给了我很多好主意,我希望我能接受你所有的答案:)
好问题!我的第一个想法是使用基于数据库的解决方案。如果您还没有,您将在一个表中跟踪所有活动会话,sessions
其中包含您可能需要的session_id
和last_visited_time
. 每次用户访问您的网站时,都会更新此条目:
UPDATE sessions WHERE session_id = "<current session id>" SET last_visited_time = NOW()
该机制的第二部分将是一个 cronjob,它扫描sessions
表以查找last_visisted_time
最近没有更新的会话(在您想要的任何时间间隔内)并删除该会话的文件。
一种方法是打电话
$thePath = session_save_path();
并遍历所有保存的会话文件,反序列化每个文件并检查它们是否具有指定的超时属性。
不幸的是,您需要扫描整个目录以查找所有会话文件,这些文件早于定义的时间段。您将用于start()
计算会话文件的年龄。
在维护良好的服务器上,每个虚拟主机都应该有一个单独的目录来存放其会话数据。维护得不太好的可能会将所有会话存储在统一的共享目录中。因此,请确保您没有读取或删除其他虚拟主机的会话数据。
因此,我建议将会话数据保存到应用程序的后端数据库。使用 SQL,查找所有过时的会话文件将是微不足道的。
的文档session_set_save_handler()
提供了一个示例,它基于对象很好地解释了整个过程。
I like all the answers above, but a different solution would be to name the uploaded files in a way that you know they are "temporary", for example prepending their name with a timestamp. This way, a periodic process would clean any such files, unless your program decides that they should be kept after all, renaming them accordingly.