Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2会话未按预期工作/会话持续超时_Php_Symfony_Session - Fatal编程技术网

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

Php Symfony2会话未按预期工作/会话持续超时,php,symfony,session,Php,Symfony,Session,我的Symfony2应用程序显示一个主页面,从主页面开始,它主要使用AJAX请求通过modals向用户显示内容 我注意到,在用户空闲一段时间(大约15-30分钟)后,会话被破坏,用户注销,需要再次登录。这是令人难以置信的沮丧,因为我不能期望用户在空闲几分钟后再次登录 据我所知,根据我的config.yml文件,这个问题不应该发生,如下所示: framework: session: cookie_lifetime: 0 # Session lifetime in

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

我注意到,在用户空闲一段时间(大约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

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

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
  • PHP5.4
  • 会话处理程序:默认值(根据
    php.ini
    基于文件)
  • Ubuntu服务器12.10

总结:

  • 应该发生什么:用户不应该注销,即使在闲置数小时之后
  • 实际发生的情况:用户在空闲15-30分钟后被注销

如何解决此问题?

摘录:

cookie\u生命周期

类型:整数默认值:null

这将确定会话的生存期(以秒为单位)。它将使用 默认为null,这意味着session.cookie\u的生存期值来自 将使用php.ini将此值设置为0表示cookie为0 对浏览器会话的长度有效。


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

我将RememberMeCookie设置为默认值,然后在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缓存

摘录:

保存路径

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

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

还可以通过将该值设置为null,将该值设置为php.ini的save_路径


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

问题:

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

cronjob实际上不知道什么是“旧的”。cronjob只需调用位于
/usr/lib/php5/maxlifete
的PHP-CLI脚本,然后删除超过某个时间段的所有会话文件。由于该脚本由PHP-CLI参与,并且独立于Symfony2,因此它不知道您在Symfony2配置文件中为
gc\u maxlifety
cookie\u lifety
指定了哪些值。相反,如果只是默认使用
/etc/php5/cli/php.ini
配置文件中的
session.cookie\u lifety
session.gc\u maxlifete
值,默认值为24分钟。因此,无论您在Symfony2配置文件中指定了什么,如果您的空闲时间过长,您的会话都将被删除


解决方案:

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

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

      nano/etc/cron.d/php5 这打开了一个文件,其中显示了非常长的crontab代码,默认情况下每30分钟清除一次会话。脚本前面有一个#,我所做的就是通过删除#来取消这两行的注释。因此:


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

      您可以检查浏览器中实际设置的coockie生存期吗?未设置cookie过期日期(这意味着它是在浏览器打开期间)。据我所知,问题在于Symfony在会话实际过期之前销毁了会话。请确保在使用symfI会话时,您没有使用
      $\u session
      来跟踪您的VAR。我根本没有接触会话。所有这些都由Symfony处理,并且仅用于保持用户登录。我没有在会话中的任何位置存储任何数据。我以前测试过它,将其设置为与gc_maxlife相同的值,即8小时,但我仍然存在相同的问题。此外,将其设置为0,它应该至少在浏览器打开时保持有效,但情况并非如此。用户没有关闭他们的浏览器,他们仍在注销。我不是root用户,因此无法执行第一个解决方案,因此如何在数据库中创建symfony store会话并延长其生存期?