【问题标题】:After 20 minutes of inactivity, session should be expired within the application20 分钟不活动后,会话应在应用程序内过期
【发布时间】:2026-02-22 01:30:01
【问题描述】:

在 20 分钟不活动后,会话应在应用程序内过期。

我如何在 symfony2 中做到这一点。

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    config.yml 文件的framework 部分下设置session 过期时间。

    config.yml

    framework:
      secret:        %secret%
      charset:       UTF-8
      error_handler: null
      csrf_protection:
          enabled: true
      router:        { resource: "%kernel.root_dir%/config/routing.yml" }
      validation:    { enabled: true, annotations: true }
      templating:    { engines: ['twig'] } #assets_version: SomeVersionScheme
      session:
          default_locale: %locale%
          lifetime:       3600
          auto_start:     true
    

    session: lifetime 的值更改为以秒为单位的默认值 3600。

    【讨论】:

    • 我认为 gc_maxlifetime 与生命周期相同。对吗?但是当用户不活动时如何注销此会话。
    • 是的。如果垃圾收集处理程序被调用,PHP 将传递存储在php.ini 指令会话gc_maxlifetime 中的值。任何超过gc_maxlifetime 之前保存的存储会话都应该被删除。这允许根据空闲时间使记录过期。
    • 我在 config.yml 文件中添加了参数 cookie_lifetime: 1200 ,但如果用户处于活动状态,则不应注销。仅当用户不活动 20 分钟时注销。我该怎么办?
    • 设置cookie生命周期是不合适的,因为它可以被客户端操纵,所以你必须在服务器端做过期。最简单的方法是通过垃圾收集来实现这一点,它运行得相当频繁. cookie_lifetime 将设置为一个相对较高的值,垃圾收集 gc_maxlifetime 将设置为在所需的空闲时间销毁会话。
    • 嗨,我在 config.yml 文件中设置了 gc_maxlifetime 或 cookie_lifetime 变量的时间,但即使用户处于活动状态,它仍然会注销应用程序。
    【解决方案2】:

    本机会话存储使用 cookie。处理会话的另一个例子是将它们存储在数据库中。

    Jayson 的方法会导致会话在一小时后过期。您还可以随时强制注销用户,如下所示:

    $this->container->get('request')->getSession()->invalidate();
    $this->container->get('security.context')->setToken();
    

    注意:从 Symfony 2.6 开始,security.context 服务已被弃用,并分为两个新服务:security.authorization_checker 和 security.token_storage。

    Link to framework configuration for session

    【讨论】:

    • 意思是根据Jayson的方法只在配置文件中设置lifetime参数&会话在特定时间后自动注销?还是应该写其他代码?
    • 对。杰森的方法是“一劳永逸”。 :) 但是,您也可以选择手动注销用户。虽然,其实是cookie_lifetime: 3600
    • 我在 config.yml 文件中添加了参数 cookie_lifetime: 1200 ,但如果用户处于活动状态,则不应注销。仅当用户不活动 20 分钟时注销。我该怎么办?