假设用户在我的网站上做了一些事情,例如上传了一些图片或其他什么,但他没有注销就离开了,再也没有回来,或者说几个月后他确实回来了。
所以我的问题是,是否有某种方法可以在会话到期后删除他上传的文件,比如说在30分钟后(请记住,用户从未重新加载过页面),这样就需要完全在服务器端运行,而不会受到用户的干扰。
EDIT感谢大家的精彩回答,它给了我很多好主意,我希望我能接受你们的所有答案:)
好问题!我的第一个想法是使用基于数据库的解决方案。如果您还没有,您可以在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()
的文档提供了一个示例,它基于对象很好地解释了整个过程。
我喜欢上面的所有答案,但另一种解决方案是以一种你知道它们是"临时"的方式命名上传的文件,例如在它们的名称前面加上时间戳。这样,一个周期性的过程会清除任何这样的文件,除非你的程序决定应该保留它们,并相应地重命名它们。