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


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

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

编辑 谢谢大家的精彩答案,它给了我很多很棒的想法,我希望我能接受你所有的答案:)


5065
2017-07-22 19:07


起源

一种方法是强制用户注册,但我想看看人们会想出什么答案。 - Madara Uchiha♦
浏览 这个问题 也 - spacediver


答案:


一种方法是打电话

  $thePath = session_save_path();

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

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

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

使用数据库的更好方法

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

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


4
2017-07-22 19:16



@Phoenix谢谢你编辑! - SteAp


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

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

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


6
2017-07-22 19:15





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


1
2017-07-22 22:38



如果他的要求是在一定时间后删除临时文件,这将有效,但OP想要在用户会话到期后执行某个操作(删除一些文件),这可能是在30分钟之后,但很可能在几个之后小时。因此,您的方法可能会在用户会话到期之前删除文件。然后,您可以说“我清理一周前创建的文件”,几乎可以确保用户会话已经过期,但这会不必要地增加99%的磁盘使用时间(会话〜= 30分钟) - fresskoma
当然,但是海报说“例如”,所以我想非会话相关的解决方案并非不可能 - periklis