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


Symfony2 sessions not working as expected / session keeps timing out

我的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分钟后被注销


我该如何解决这个问题?

问题:

原来在Debian/Ubuntu系统上,有一个系统cronjob每30分钟运行一次,清理所有"旧"会话。这就是问题所在。

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


解决方案:

  • 删除/etc/cron.d/php5处的cronjob文件,或者
  • 将会话存储在数据库中,这样cronjob就无法访问会话。

我将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

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

请求之间是否清除Symfony缓存

symfony文档摘录:

save_path

类型:字符串默认值: % kernel.cache.dir %/会话

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

您也可以将该值设置为php.ini的save_path,方法是将该值设置为null

默认情况下,Symfony将会话存储在清空缓存时清空的缓存目录中…

symfony文档摘录:

cookie_lifetime

类型:整数默认值:

确定会话的生存期(以秒为单位)。它会使用默认为空,表示会话。Cookie_lifetime value from将使用Php.ini。将此值设置为0表示cookie是

所以,0不是无限会话而是浏览器会话…您应该定义大量的秒数并进行测试。

Travis T,我选择了最简单的路线。我说

<标题>纳米/etc/cron.d/php5 h1> 打开了一个文件,显示了非常长的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 #。就是这样!