在会话自动销毁之前调用自定义方法
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()。
正确。这几乎就是我们的答案之间的差异。以上是关于在会话自动销毁之前调用自定义方法的主要内容,如果未能解决你的问题,请参考以下文章