我的Symfony2应用程序显示了一个主页,从那里开始,它主要使用AJAX请求通过情态向用户显示内容。
我注意到,在用户空闲一段时间后(大约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
为完整起见,我的当前环境如下:
- Symfony 2.4.8 PHP 5.4
- 会话处理程序:默认(根据
php.ini
基于文件) Ubuntu Server 12.10
概要:
- 应该发生的事情:用户不应该注销,即使闲置了几个小时
- 实际情况:用户在空闲15-30分钟后被注销
我该如何解决这个问题?
问题:
原来在Debian/Ubuntu系统上,有一个系统cronjob每30分钟运行一次,清理所有"旧"会话。这就是问题所在。
cronjob实际上并不知道什么是"old"。cronjob只是调用位于/usr/lib/php5/maxlifetime
的PHP-CLI脚本,然后删除所有超过一定年龄的会话文件。由于脚本是由PHP-CLI参与的,并且独立于Symfony2,因此它不知道您在Symfony2配置文件中为gc_maxlifetime
和cookie_lifetime
指定了什么值。相反,它只是默认使用/etc/php5/cli/php.ini
配置文件中的session.cookie_lifetime
和session.gc_maxlifetime
值,默认情况下是24分钟。因此,无论您在Symfony2配置文件中指定什么,如果您空闲的时间太长,您的会话将被删除。
解决方案:
- 删除
/etc/cron.d/php5
处的cronjob文件,或者 - 将会话存储在数据库中,这样cronjob就无法访问会话。
我将cookie设置为默认值,然后在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缓存
symfony文档摘录:
save_path
类型:字符串默认值: % kernel.cache.dir %/会话
这决定了传递给保存处理程序的参数。如果你选择默认的文件处理程序,这是会话所在的路径创建文件。有关详细信息,请参见配置目录
您也可以将该值设置为php.ini的save_path,方法是将该值设置为null。
默认情况下,Symfony将会话存储在清空缓存时清空的缓存目录中…
symfony文档摘录:
cookie_lifetime
类型:整数默认值:空
确定会话的生存期(以秒为单位)。它会使用默认为空,表示会话。Cookie_lifetime value from将使用Php.ini。将此值设置为0表示cookie是
所以,0不是无限会话而是浏览器会话…您应该定义大量的秒数并进行测试。
Travis T,我选择了最简单的路线。我说
<标题>纳米/etc/cron.d/php5 h1> 打开了一个文件,显示了非常长的crontab代码,默认情况下每30分钟清除一次会话。该脚本前面有一个#,我所做的就是通过删除#来取消注释这两行。所以:# Look for and purge old sessions every 30 minutes
# 09, 39, * * * * root @[ -x /usr/lib/php5/maxlifetime ] && [ etc
it's a long file.....]
我只是去掉了Look和09前面的2 #。就是这样!
标题>