PHP在会话过期时执行某些操作


PHP Do something when session gets expired

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

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

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

好问题!我的第一个想法是使用基于数据库的解决方案。如果您还没有,您可以在sessions表中跟踪所有活动会话,该表包含session_idlast_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()的文档提供了一个示例,它基于对象很好地解释了整个过程。

我喜欢上面的所有答案,但另一种解决方案是以一种你知道它们是"临时"的方式命名上传的文件,例如在它们的名称前面加上时间戳。这样,一个周期性的过程会清除任何这样的文件,除非你的程序决定应该保留它们,并相应地重命名它们。