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

Ric*_*ler 5 php session symfony

我的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
Run Code Online (Sandbox Code Playgroud)


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

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


摘要:

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


我怎样才能解决这个问题?

Ric*_*ler 11

问题:

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

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


解决方案:

  • /etc/cron.d/php5或删除cronjob文件,
  • 将会话存储在数据库中,cronjob无法触及它们