PHP会话后清理

时间:2012-04-24 04:49:57

标签: php session

我是PHP的新手,甚至是PHP Sessions的新手,但是我已经阅读了很多关于它的内容。但是,我一直无法找到问题的答案。这是一个简化版本: 1 - 用户在页面上的表单中键入名称 2 - php文件获取名称,启动会话并在服务器上为用户创建一个目录,其中包含用户可以查看的一些自定义文件。

以下是问题: 由于这不是真正的登录机制,因此不会有注销或会话超时,我不想强​​制超时。因此,只要他/她打开浏览器页面,就应该仍然可以访问为服务器上的用户创建的目录。如何知道浏览器何时关闭且用户不再使用会话,以便我可以删除服务器上的自定义目录?是否存在与可以使用的服务器上的会话文件相关的任何内容:例如,如果垃圾收集清除会话并且它不再存在,那么我可以运行脚本来检测它并删除与之关联的目录删除的会话。

我不清楚的是,如果永远不调用session_destroy(),服务器上的会话会发生什么。

5 个答案:

答案 0 :(得分:1)

  

我如何知道浏览器何时关闭以及用户不再使用会话,以便我可以删除服务器上的自定义目录?

理论上,你永远不会知道。你有两个选择。以下每个选项都有自己的优点和缺点。

  • 使用正文onunload事件向服务器发送请求以销毁会话。不会一直工作。用户打开两个选项卡并关闭一个选项卡的最简单示例。
  • 每3分钟左右就有一个AJAX请求命中服务器。在长期会议中毫无用处。当然,你可以根据你在正常课程中的期望来定制'3分钟'。
  

是否存在与可以使用的服务器上的会话文件相关的任何内容

在上述情况下,您手动销毁会话。您可以在销毁会话时删除目录。

  

我不清楚的是,如果永远不调用session_destroy(),服务器上的会话会发生什么。

会话有一个到期时间。您可以使用以下方式“获取”它: ini_get("session.gc_maxlifetime");

并使用以下方式设置: ini_set(“session.gc_maxlifetime”,“3600”); // 3600分钟。

答案 1 :(得分:1)

“只要浏览器处于打开状态”的定义在无状态HTTP连接中非常棘手。简而言之:您无法可靠地告知浏览器窗口打开或关闭的时间长短,原因很简单,因为浏览器和服务器之间没有持久连接。浏览器请求页面,服务器提供它,连接关闭。页面可能会或可能不会在浏览器中打开,浏览器可能会或可能不会返回请求其他页面。你只是不知道。

这就是为什么所有服务器端状态(包括会话)都基于超时。如果客户端没有返回x段时间,您可以假设他已离开并丢弃已保存的数据。

做其他事情很棘手并且有缺点。例如,您可以在页面上包含一段Javascript,每隔一段时间触发一次请求,告诉服务器用户仍然在那里。这会给服务器带来更大的负担,但是当没有真正发生任何事情时,它会从许多不同的客户端获得持续的心跳。

另一种方法是挂钩beforeunload Javascript事件,您可以使用该事件来检测用户何时关闭页面。这绝对不能保证一直工作,但是由于各种原因,你不会在服务器上收到每一个页面的负载。因此,即使在这种情况下,您最终也需要丢弃旧数据。

最好的方法是围绕超时和删除过期数据的想法构建你想做的任何事情,因为这是唯一真正可靠的方法。

答案 2 :(得分:0)

无。绝对没有什么特别的事情发生。会话在一段时间后到期,需要重新进行身份验证,这正是session_destroy时发生的情况。

答案 3 :(得分:0)

  

由于这不是真正的登录机制,因此不会有注销或会话超时,我不想强​​加超时。

实际上 - 它是一种真正的登录机制 - 您有一个用户通过“在表单上输入名称”来执行登录 - 然后他们就会登录。它与用户名不同。

你没有“退出”机制。

您不能依赖浏览器告诉您何时关闭,留下等等 - 它不可靠并且不起作用。因此 - 您最好的(也是唯一的)解决方案是检查服务器端的会话状态。只需创建一个每15分钟左右运行一个php文件的CRON作业。每次运行php文件时 - 它会检查所有会话的最后活动时间。如果上次活动时间超过超时限制,则运行清理。

我知道你说你不想“施加超时” - 但是你将不得不在沙地上划一条线,然后说“嘿,如果我的用户对于X分钟(或者甚至是X)不活跃小时) - 然后可以安全地假设他们已经离开并且没有回来!“只需设置一个非常高的门槛。

答案 4 :(得分:0)

如果我没记错,会话的默认超时时间是1440秒,那么它会自动失效。如果你没问题,那就什么都不做。