【问题标题】:Symfony2 sessions not working as expected / session keeps timing outSymfony2 会话未按预期工作/会话不断超时
【发布时间】:2014-10-13 16:04:56
【问题描述】:

我的 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 服务器 12.10


总结:

  • 应该发生的情况:用户不应退出,即使闲置数小时后也是如此
  • 实际情况:用户在闲置 15-30 分钟后被注销


我该如何解决这个问题?

【问题讨论】:

  • 你能检查一下浏览器中实际设置的coockie生命周期吗?
  • 未设置 cookie 的到期日期(这意味着它是在浏览器打开期间)。据我所知,问题在于 Symfony 在会话实际过期之前销毁会话。
  • 确保您在使用来自 symf 的会话时不使用 $_SESSION 来跟踪您的变量
  • 我根本没有接触到会话。这一切都由 Symfony 处理,仅用于保持用户登录。我不会在任何地方的会话中存储任何数据。

标签: php symfony session


【解决方案1】:

symfony documentation 的摘录:

cookie_lifetime

类型:整数 默认值:null

这决定了会话的生命周期 - 以秒为单位。它将使用 默认为 null,这意味着 session.cookie_lifetime 值来自 将使用 php.ini。 将此值设置为 0 意味着 cookie 是 在浏览器会话的长度内有效。

因此,0 不是无限会话,而是浏览器会话...您应该定义大量秒数并对其进行测试。

【讨论】:

  • 我之前测试过,将它设置为与gc_maxlifetime相同的值,即8小时,但我仍然遇到同样的问题。
  • 另外,通过将其设置为 0,它应该至少在浏览器打开时保持有效,但事实并非如此。用户没有关闭他们的浏览器,他们仍然被注销。
【解决方案2】:

我设置记住我的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

【讨论】:

    【解决方案3】:

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

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

    symfony documentation 的摘录:

    保存路径

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

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

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

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

    【讨论】:

      【解决方案4】:

      问题:

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

      cronjob 实际上并不知道什么是“旧”。 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 无法触及的数据库中

      【讨论】:

      • 我不是 root,所以我不能做第一个解决方案,那么如何在数据库中创建 symfony 存储会话并使其生命周期更长?
      【解决方案5】:

      Travis T,我走的是最简单的路线。我说

      纳米/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#,就这样!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-25
        相关资源
        最近更新 更多