2010-02-13 72 views
3

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

回答

4

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

您不会找到任何原生PHP设施来实现您的目标。会话超时不会在后台运行。您甚至不知道会话是否超时,除非超时会话尝试另一次访问。在这一点上,几乎不可能陷入困境,你可以做出适当的决定和处理。

我建议队列&轮询体系结构为这个问题。这很容易,一定会工作。如果您担心事务性能,请添加memcached。

+0

我做了类似的事情。我做了一个函数,它会更新用户最近的页面/活动,并轮询查找大于2分钟的非活动会话的数据库并清除它们。我认为我可以用一块石头杀死两只鸟。凌乱,但完成了工作,无需创建一个cron工作。 – 2012-06-11 21:16:09

0

我认为你正在使用标准的基于PHP文件的会话。如果是这样的话,那么PHP将根据php.ini中的session.gc_ *配置参数自行收集过时的会话。您可以重写这些以完全禁用垃圾回收器,然后滚动您自己的GC脚本。

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

-1

JavaScript上的窗口关闭事件呢?所以基本上会话会在会话网站的所有窗口关闭时被销毁。所以,最后一个窗口关闭时(通过额外的js检查来检查)发送ajax请求到服务器。

+0

好主意,不过就是因为关闭窗口并不意味着会话结束,他们可以保持浏览器打开并重新加载网页,他们仍然会使用他们的原始会话。不仅如此,在同一个域中留下一个网页作为另一个网页会触发ajax事件,该事件会在数据库仍然访问该网站时从数据库中删除会话信息。如果有一个JavaScript事件来检查浏览器关闭,那会更好。 – 2012-06-11 21:43:50