在会话自动销毁之前调用自定义方法

Posted

技术标签:

【中文标题】在会话自动销毁之前调用自定义方法【英文标题】:Calling custom method before session auto destroy 【发布时间】:2016-03-06 19:47:33 【问题描述】:

有没有办法在会话自动/手动销毁之前调用自定义方法?

我的问题是,我正在数据库中捕获用户注销时间。当用户手动注销时(通过调用注销方法),它工作正常,但是当用户的会话在超时后自动销毁时,我无法捕获注销时间。

感谢您对此提出的建议。

【问题讨论】:

会话销毁后用户是否需要重新登录?即会话是您记录用户登录的地方吗?如果是这样,他们下次登录时会记录旧登录会话必须已过期的事实? 【参考方案1】:

是的,这是可能的。 See this website for a in-depth tutorial 使用 session_set_save_handler() (php doc) 您可以为 GC(垃圾收集)循环添加自己的函数。这样您就可以知道哪些会话即将被该垃圾回收周期销毁,并使用当前时间戳手动更新数据库中的这些记录。

如果你随后通过调用默认的 GC 处理程序来结束你的函数,那么你基本上已经在两者之间插入了你自己的一些逻辑。

【讨论】:

【参考方案2】:

在 php 中,您可以实现 SessionHandlerInterface 并在 destroy()gc() 上使用您的自定义代码(参见 cmets),更多信息这里 - http://php.net/manual/en/class.sessionhandlerinterface.php

在 YII 中你可以设置一个custom session handler。

【讨论】:

第二个链接没有正确解析:-( 这个问题是destroy():destroy 仅在会话被显式销毁时调用,而不是在它被垃圾收集器销毁时调用。 destroy($sessionId) This callback is executed when a session is destroyed with session_destroy() or with session_regenerate_id() with the destroy parameter set to TRUE. 那你需要实现gc() 正确。这几乎就是我们的答案之间的差异。

以上是关于在会话自动销毁之前调用自定义方法的主要内容,如果未能解决你的问题,请参考以下文章

在Android中销毁布局时覆盖的方法

融云自定义消息不显示

videojs在vue中的使用(自定义组件,如清晰度)

在 viewDidLoad 之前调用 ViewController 上的自定义 init 方法

如何注销使用自定义设计策略登录的用户

简述拦截器的工作原理以及你在项目中使用过哪些自定义拦截器。