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

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

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

感谢您对此提出的建议。

【问题讨论】:

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

标签: php session yii


【解决方案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()
    • 正确。这几乎就是我们的答案之间的差异。
    猜你喜欢
    • 1970-01-01
    • 2018-03-18
    • 2012-02-15
    • 2015-03-20
    • 2011-12-07
    • 2016-01-03
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    相关资源
    最近更新 更多