0

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

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

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

4

5 回答 5

1

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

从理论上讲,你永远无法知道这一点。你有两个选择。以下每个选项都有其自身的优点和缺点。

  • 使用 bodyonunload事件向服务器发送请求以销毁会话。不会一直工作。当用户打开两个选项卡并关闭一个选项卡时的最简单示例。
  • 每 3 分钟左右有一个 AJAX 请求访问服务器。在长期会议中无用。当然,您可以根据您在正常会话中的期望自定义“3 分钟”。

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

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

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

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

并使用: ini_set("session.gc_maxlifetime","3600" ); //3600 分钟。

于 2012-04-24T04:59:27.180 回答
1

在无状态 HTTP 连接中,“只要浏览器打开”的定义非常棘手。长话短说:您无法可靠地判断浏览器窗口打开了多长时间或何时关闭,这仅仅是因为浏览器和服务器之间没有持久连接。浏览器请求一个页面,服务器交付它,连接关闭。该页面可能会或可能不会在浏览器中打开,并且浏览器最终可能会或可能不会返回请求另一个页面。你只是不知道。

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

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

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

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

于 2012-04-24T05:00:32.767 回答
0

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

于 2012-04-24T04:55:35.300 回答
0

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

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

您只是没有“注销”机制。

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

我知道您说过您不想“强制超时”-但您将不得不在某处的沙子上画一条线,然后说“嘿,如果我的用户在 X 分钟(甚至 X 小时)内不活动)-那么可以安全地假设他们已经离开并且不会回来了!”。只需设置一个非常高的阈值。

于 2012-04-24T05:13:39.370 回答
0

If I remember correctly default time-out for session is 1440 seconds, so it will expire automatically. If it is OK for you, then do nothing.

于 2012-04-24T05:36:19.373 回答