Symfony2会话未按预期工作/会话保持超时

时间:2014-08-20 10:23:22

标签: php symfony session

我的Symfony2应用程序显示一个主页面,从那里开始主要使用AJAX请求通过模态向用户显示内容。

我注意到,在用户闲置一段时间(大约15-30分钟)后,会话被破坏,用户退出并需要再次登录。这令人非常沮丧,因为我不能指望用户每次闲置几分钟都会再次登录。

据我所知,这个问题不应该根据我的config.yml文件发生,如下所示:

framework:
    session:
        cookie_lifetime: 0      # Session lifetime in seconds
        gc_maxlifetime: 28800   # Seconds after which data will be seen
                                # as garbage and potentially cleaned up
        handler_id:  ~          # Current using the default session handler


为了完整起见,我目前的环境如下:

  • Symfony 2.4.8
  • PHP 5.4
  • 会话处理程序:默认(根据php.ini基于文件)
  • Ubuntu Server 12.10


要点:

  • 应该发生什么:即使闲置数小时,用户也不应该退出
  • 实际发生的事情:用户在闲置15-30分钟后正在退出


我该如何解决这个问题?

5 个答案:

答案 0 :(得分:11)

问题:

事实证明,在Debian / Ubuntu系统上,有一个系统cronjob每30分钟运行一次,清除所有" old"会话。这就是问题所在。

cronjob实际上并不知道是什么构成了#34; old"。 cronjob只调用位于/usr/lib/php5/maxlifetime的PHP-CLI脚本,然后删除超过特定年龄的所有会话文件。由于脚本由PHP-CLI参与,并且独立于Symfony2,因此不知道您在Symfony2配置文件中为gc_maxlifetimecookie_lifetime指定了哪些值。相反,如果只是默认使用session.cookie_lifetime配置文件中的session.gc_maxlifetime/etc/php5/cli/php.ini值,默认情况下为24分钟。因此,无论您在Symfony2配置文件中指定了什么,如果您闲置太久,您的会话将被删除。


解决方案:

  • 删除/etc/cron.d/php5
  • 处的cronjob文件
  • 将您的会话存储在数据库中,而cronjob
  • 无法触及这些数据库

答案 1 :(得分:1)

我设置记住我设置为默认的cookie,然后是security.yml

security:
    firewalls:
        main:
            form_login:
                remember_me: true
            remember_me:
                key: mycookie
                lifetime: 2592000 # 30 days
                path: /
                domain: ~
                always_remember_me: true

答案 2 :(得分:1)

我的第一个答案似乎不适合您的问题。也许这个会有所帮助。

您是否在请求之间清除了Symfony缓存?

symfony documentation的摘录:

  

<强>的save_path

     

输入:字符串默认值: %kernel.cache.dir%/ sessions

     

这确定了要传递给保存处理程序的参数。如果你   选择默认文件处理程序,这是会话所在的路径   文件已创建。有关更多信息,请参阅配置目录   会话文件保存的位置。

     

您还可以通过将值设置为 null 将此值设置为php.ini的 save_path

默认情况下,Symfony将会话存储在缓存目录中,同时清除缓存...

答案 3 :(得分:0)

symfony documentation的摘录:

  

<强> cookie_lifetime

     

键入:整数默认值: null

     

这决定了会话的生命周期 - 以秒为单位。它会用   默认情况下为null,表示来自的session.cookie_lifetime值   将使用php.ini。 将此值设置为0表示cookie为   对浏览器会话的长度有效。

所以,0不是无限会话但浏览器会话...你应该定义一个大的秒数并测试它。

答案 4 :(得分:0)

特拉维斯T,我走的是最简单的路线。我说

nano /etc/cron.d/php5

这会打开文件,显示非常长的crontab代码,默认情况下每隔30分钟清除一次会话。脚本前面有一个#,我所做的就是通过删除#来取消注释两行。所以:

#  Look for and purge old sessions every 30 minutes
#  09, 39, *  * * *  root  @[ -x /usr/lib/php5/maxlifetime ] && [  etc 
   it's a long file.....]

我刚刚删除了Look和09前面的2#。就是这样!