Symfony 3.4 会话时间

Symfony 3.4 session time

在我的 Symfony 3.4 应用程序中,用户在一段时间后自动注销。我想更改此行为并使我的应用程序永远不会自动注销。它应该仅在用户单击注销时注销会话 link。

我已阅读文档并尝试设置 cookie_lifetime 但它对我不起作用。如果有人在这方面工作,请建议如何进行。

更新:

我正在使用此文档页面http://symfony.com/doc/master/components/http_foundation/session_configuration.html#session-lifetime

我正在使用基于 Symfony 3.4 flex 的项目。

我正在 config/packages/framework.yml 中设置配置。配置如下:

framework:
    session:
        handler_id: ~
        cookie_lifetime: 31536000
        gc_maxlifetime: 31536000

经过长时间的调试,我发现以下配置告诉 Symfony 使用默认的 PHP 保存处理程序和默认的会话文件路径。

framework:
    session:
        handler_id: ~

因此 Symfony 会话文件存储在 /var/lib/php/sessions 目录中。在基于 Debian 的操作系统中,cron 作业每半小时删除一次会话文件。此 cron 作业根据与 apache2 关联的 PIDs 识别活动会话,并仅更新这些活动会话文件的最后访问时间和最后修改时间。

然后同一个 cron 作业正在删除最后修改时间在 gc_maxlifetime 之前的会话文件,即;非活动会话。主要问题是 gc_maxlifetime 仅根据 php.ini 文件确定,而不考虑 Symfony 的 .yaml 文件。因此,Symfony 的 .yaml 文件中的配置将被忽略,并使用 PHP 的 gc_maxlifetime

这使得会话文件在 20 分钟到 30 分钟后被删除。为了解决这个问题,我更新了 .yaml 配置如下:

framework:
    session:
        handler_id: session.handler.native_file
        save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'
        cookie_lifetime: 31536000
        gc_maxlifetime: 31536000

现在会话文件不存储在默认 /var/lib/php/sessions 目录中,因此 cron 作业不会删除会话文件。现在 Symfony 正在处理这个会话处理工作,它现在工作得很好。

这是 symfony 4 的解决方案。

session:
        #handler_id: ~
        handler_id: session.handler.native_file
        save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'        
        cookie_lifetime: 1800 // was "lifetime" but deprecated

万一有 RedisSessionHandler configured for session storage,还应该考虑增加传递给服务的 ttl 参数:

# config/services.yaml
services:
    # ...
    Symfony\Component\HttpFoundation\Session\Storage\Handler\RedisSessionHandler:
        arguments:
            - '@Redis'
            # you can optionally pass an array of options. The only options are 'prefix' and 'ttl',
            # which define the prefix to use for the keys to avoid collision on the Redis server
            # and the expiration time for any given entry (in seconds), defaults are 'sf_s' and null:
            - { 'prefix': 'my_prefix', 'ttl': 600 } # also set equal 31536000