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

时间:2012-07-22 19:07:15

标签: php

因此,假设用户在我的网站上做了一些事情,例如上传了一些图片或其他内容,他离开时没有退出,也没有回来或让我说他确实在几个月后回来了。

所以我的问题是,是否有某种方式例如在会话过期后删除他上传的文件,假设在30分钟后(请记住用户从不重新加载页面),因此需要完全运行在服务器端没有用户干扰。

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

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:4)

一种方法是致电

  $thePath = session_save_path();

并迭代所有保存的会话文件,对每个文件进行反序列化并检查它们是否有指定的超时属性。

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

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

使用数据库的更好方法

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

session_set_save_handler()的文档提供了一个示例,explains this whole process很好地基于对象。

答案 2 :(得分:1)

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