如何在Symfony2中延长每个请求的remember_me cookie?

时间:2012-09-26 15:52:56

标签: symfony remember-me

我使用标准remember_me symfony功能,但它会在每个时间段到期,在config中设置。 例如。我将lifetime设置为1800.无视我的操作,它会在上次登录后0.5小时后将其注销。而且我希望它只在0.5小时不活动后才能退出。

每个请求都应该延长记住我的cookie。

这可以通过配置完成,还是应该搞乱内核事件并手动破解?

1 个答案:

答案 0 :(得分:4)

确实有一种方法只能使用配置设置,但仅限于Symfony 2.1。要走的路是使用PHP中集成的会话的垃圾收集。在这里你如何实现它。

在config.yml文件中,设置以下变量:

framework:
  session:
    cookie_lifetime: 86400 # One day, cookie lifetime
    gc_maxlifetime: 1800 # 30 minutes, session lifetime
    gc_probability: 5
    gc_divisor: 100

使用此配置,发送到浏览器的cookie将有效一整天。但是,会议将持续30分钟。由于会话是在每个请求中保存的,因此在每个请求之后将重新启动生命周期。因此,会议将在每次请求时延长。

然后,垃圾收集部分来了。这可能是“有问题的”,取决于你想要的精确程度。属性gc_probabilitygc_divisor控制垃圾收集的运行频率。这些数字意味着GC将在每次会话初始化时以5%(5/100,gc_probability / gc_divisor)的概率运行。

这意味着当GC运行时,它将删除过期的会话。但是,由于这是一个概率特征,因此您无法完全控制它。在您指定的生命周期之后仍可以访问某些会话,因为GC尚未运行。

如果这对您来说是个问题,那么您需要在每个请求上都有一个监听器,并检查该会话是否仍然有效。如果要在会话过期时向用户显示消息,则还需要执行此操作,因为还没有会话过期事件。

别忘了,我的答案仅在Symfony 2.1中有效。在2.0上,您还需要一个请求侦听器来验证会话生存期值。

这里有一些关于会话空闲时间的链接:

  1. PR上引入保持活动会话的链接:PR-2171
  2. 会话文档:here
  3. 会话gc上的PHP网站:here
  4. 希望这会对你有所帮助。

    此致 马特