PHP Session过期事件

时间:2010-02-13 00:07:39

标签: php session

我正在尝试对开源项目进行一些更改。我想跟踪用户何时登录和注销。 现在我在登录或手动注销时在db中更改其登录状态。现在的问题是我无法确定用户是否只是在没有按下注销按钮的情况下关闭了浏览器。 出于这个原因,我需要触发一个每次用户会话到期时都会更改数据库的函数。 我在PHP中尝试了session_set_save_handler,但看起来我需要覆盖整个会话行为。我正在寻找的是保持默认会话行为,并在用户会话到期时添加功能。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:4)

我曾经做过一些真的令人讨厌的事情。每次通过页面刷新/获取/等等“更新”会话时,我都更新了数据库行上的时间戳。第二个守护进程每10分钟对数据库进行一次轮询,并执行“清理”操作。

您将找不到任何本机PHP工具来实现您的目标。会话超时不在后台运行。您甚至不知道会话是否超时,除非超时会话尝试另一次访问。在这一点上,几乎不可能陷阱,你可以做出决定并妥善处理。

我建议排队&民意调查这个问题的架构。它很容易,肯定会起作用。如果您对交易性能有疑虑,请添加memcached。

答案 1 :(得分:0)

我认为你正在使用标准的基于PHP文件的会话。如果是这种情况,那么PHP将根据php.ini中的session.gc_ *配置参数自行完成陈旧会话的垃圾收集。您可以覆盖它们以完全禁用垃圾收集器,然后滚动您自己的GC脚本。

您可以检查文件的时间戳(使用stat()循环快速轻松地查找'旧'会话,或者解析每个文件中的数据以检查列出最后一个的变量 - 访问时间。无论哪种方式,会话文件只是serialize($_SESSION)的输出,可以简单地重新加载到另一个PHP实例中。

答案 2 :(得分:-1)

关于javascript的窗口关闭事件怎么样?因此,当会话站点的所有窗口都关闭时,基本上会话被销毁。因此,当最后一个窗口关闭时(通过额外的js检查来检查),向服务器发送ajax请求。