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
在我的 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