代码之家  ›  专栏  ›  技术社区  ›  Maksim Vi.

PHP会话过期事件

  •  3
  • Maksim Vi.  · 技术社区  · 15 年前

    我正在尝试对一个开源项目进行一些更改。我想跟踪用户何时登录和注销。 现在,当他们登录或手动注销时,我会在数据库中更改他们的登录状态。现在的问题是,如果用户不按注销按钮就关闭了浏览器,我就找不到答案。 因此,我需要触发一个函数,该函数将在每次用户会话到期时更改数据库。 我试过了 session_set_save_handler 在PHP中,但看起来我需要重写整个会话行为。我要寻找的是保持默认会话行为,并在用户会话到期时添加功能。有办法吗?

    3 回复  |  直到 11 年前
        1
  •  4
  •   pestilence669    15 年前

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

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

    对于这个问题,我建议使用队列和轮询架构。这很简单,肯定会奏效的。如果您担心事务性能,请添加memcached。

        2
  •  0
  •   Marc B    15 年前

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

    您可以检查文件上的时间戳(使用stat()在循环中快速简单地执行)以查找“旧”会话,或者分析每个文件中的数据以检查列出上次访问时间的变量。不管怎样,会话文件只是 serialize($_SESSION) 可以重新加载到另一个PHP实例中。

        3
  •  -1
  •   NullPointerException    12 年前

    javascript上的窗口关闭事件怎么样?所以基本上,当会话站点的所有窗口都关闭时,会话就会被破坏。所以,当最后一个窗口关闭时(通过附加的JS检查来检查),向服务器发送Ajax请求。