Symfony 3.4会话时间

7
在我的Symfony 3.4应用程序中,用户在一定时间后会自动注销。我想改变这种行为,使我的应用程序永远不会自动退出登录。只有当用户点击注销链接时,它才会注销该会话。
我已阅读文档并尝试通过设置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

你能提供一下你目前尝试过的代码示例吗?特别是你如何设置 cookie_lifetime 的部分?你是否使用了这个文档页面?https://symfony.com/doc/current/security/remember_me.html - Musterknabe
我已经添加了更多信息。 - N. Karthic Kannan
你试过我提供的链接了吗?似乎你还需要在“防火墙”中设置一些东西。 - Musterknabe
@Musterknabe 不用了,这种情况下不需要记住我。我已经在下面回答了自己的问题。 - N. Karthic Kannan
啊,抱歉,我误解了你的意思。你并不想要一个“记住我”的功能,而是希望用户根本不会被登出,对吗? - Musterknabe
3个回答

17
经过长时间的调试,我发现以下配置告诉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负责处理会话处理工作,现在它可以完美工作了。


0

如果已经为会话存储配置了RedisSessionHandler,那么还应该考虑增加传递到服务中的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

0

这是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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接