首页 文章

PHP Session过期事件

提问于
浏览
3

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

3 回答

  • 0

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

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

  • -1

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

  • 4

    我做过一次非常讨厌的事 . 每次会话都是"updated"页面刷新/获取/等等时,我更新了数据库行的时间戳 . 第二个守护进程每10分钟轮询一次DB并执行"clean-up"操作 .

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

    我建议这个问题的队列和轮询架构 . 它很容易,肯定会起作用 . 如果您对事务性能有疑虑,请添加memcached .

相关问题