11

所以假设用户在我的网站上做了一些事情,例如上传了一些图片或其他什么,他没有注销就离开了,再也没有回来,或者说他确实在几个月后回来了。

所以我的问题是,是否有某种方法可以在会话过期后删除他上传的文件,比如说 30 分钟后(请记住,用户从未重新加载页面),所以这需要完全在服务器端运行完全没有用户干预。

编辑谢谢大家的精彩回答,它给了我很多好主意,我希望我能接受你所有的答案:)

4

3 回答 3

6

好问题!我的第一个想法是使用基于数据库的解决方案。如果您还没有,您将在一个表中跟踪所有活动会话,sessions其中包含您可能需要的session_idlast_visited_time. 每次用户访问您的网站时,都会更新此条目:

UPDATE sessions WHERE session_id = "<current session id>" SET last_visited_time = NOW()

该机制的第二部分将是一个 cronjob,它扫描sessions表以查找last_visisted_time最近没有更新的会话(在您想要的任何时间间隔内)并删除该会话的文件。

于 2012-07-22T19:15:17.413 回答
4

一种方法是打电话

  $thePath = session_save_path();

并遍历所有保存的会话文件,反序列化每个文件并检查它们是否具有指定的超时属性。

不幸的是,您需要扫描整个目录以查找所有会话文件,这些文件早于定义的时间段。您将用于start()计算会话文件的年龄。

在维护良好的服务器上,每个虚拟主机都应该有一个单独的目录来存放其会话数据。维护得不太好的可能会将所有会话存储在统一的共享目录中。因此,请确保您没有读取或删除其他虚拟主机的会话数据。

使用数据库的更好方法

因此,我建议将会话数据保存到应用程序的后端数据库。使用 SQL,查找所有过时的会话文件将是微不足道的。

的文档session_set_save_handler()提供了一个示例,它基于对象很好地解释了整个过程。

于 2012-07-22T19:16:51.360 回答
1

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.

于 2012-07-22T22:38:57.723 回答