php – 即使我正在工作,会话生命周期,Ajax和Symfony2,会话也会过
如果用户在10分钟内没有做任何事情,我已将我的应用程序配置为超时关闭会话.在config.yml我有这个:
session: handler_id: ~ cookie_lifetime: 600 # 10 minutes gc_maxlifetime: 600 # 10 minutes gc_probability: 1 gc_divisor: 1 我每隔一分钟进行一次Ajax调用,以检查会话是否即将到期或不会过期,这是我检查的内容: public function isLoggedInAction(Request $request) { $response = array(); $response['authenticated'] = FALSE; $status = 200; $securityContext = $this->container->get('security.context'); if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY')) { $response['authenticated'] = TRUE; } return new JsonResponse($response,$status ?: 200); } 由于某些不知情的原因不起作用,每10分钟会话都会关闭,无论我是在处理页面还是没有,为什么?我错过了什么? 编辑1尝试新值,仍然无效: session: handler_id: ~ cookie_lifetime: 1800 gc_maxlifetime: 600 gc_probability: 1 gc_divisor: 100 当我在页面上工作,执行Ajax调用和其他一些任务时,会话已关闭,因此无效.现在显然对我有用的唯一价值是设置cookie_lifetime:86400#1天,这对我来说很疯狂! 编辑2在@acontell建议修复VM时间和日期之后我正在尝试使用这个新值(10分钟需要太长时间,所以我已经改为3): session: handler_id: ~ cookie_lifetime: 1800 gc_maxlifetime: 180 # session will expire after 3 minutes of inactivity gc_probability: 1 gc_divisor: 100 此外,我通过启用ntpd服务修复了VM上的日期/时间,现在日期很好: [root@webvm var]# date Sun Feb 1 18:35:17 VET 2015 但是5分钟后(函数调用被执行了5次)会话还活着.这是我从Javascript方面调用函数isLoggedInAction()的方法: $.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data,textStatus,jqXHR){ if( data.authenticated ){ var timer = window.setInterval(function(){ $.post(Routing.generate('isLoggedIn',jqXHR){ if( !data.authenticated ){ window.clearInterval(timer); $.growl({ message: 'La sesión ha expirado por inactividad,debe <a href=""><b>iniciar seción</b></a> nuevamente.' },{ type: "danger",allow_dismiss: false,timer: 10000,animate: { enter: 'animated fadeInDown',exit: 'animated fadeOutUp' },onHide: function(){ location.reload(); } }); } }).fail(function(){}); },60000); } }).fail(function(){}); 见下图: 测试3 在说完所有工作正常后,我做了最新的确定性测试:打开应用程序并在整个晚上(几乎8小时)保持不动,并且惊讶它永远不会关闭会话.如下图所示,看看页面有多少请求,看看会话还活着,为什么? 每隔一段时间进行Ajax调用:10.5分钟 $.post(Routing.generate('isLoggedIn',210000); } }).fail(function(){}); 设置说会话应该过期:10分钟. session: handler_id: ~ cookie_lifetime: 630000 gc_maxlifetime: 630000 # session will expire after 10 minutes of inactivity gc_probability: 1 gc_divisor: 100 服务器的时间很好: [root@webvm sencamer.dev]# date Mon Feb 2 07:26:53 VET 2015 我还应该检查什么? 测试5 好吧,我还在做测试,因为这不是一个好的行为.所以,这就是我为这个测试做的事情: >打开应用程序并开始处理它 为什么?是什么导致了这种行为?这是基于我的参数吗? 此图像显示对该功能的第一次也是唯一一次调用 通话结束后,我继续工作,但会话结束
首先,注意你的gc_probability和gc_divisor.如果两者都设置为1,则意味着在每次会话初始化时启动垃圾收集器(GC)进程的概率为gc_probability / gc_divisor = 1/1 = 1(100%).
您可以将其保留为默认值或为其提供更高的数字,以减少调用GC的可能性. 例如: session: # handler_id set to null will use default session handler from php.ini handler_id: ~ cookie_lifetime: 600 # Ten minutes gc_probability: 1 gc_divisor: 10000 此外,如果您正在使用虚拟机,请检查服务器的日期,生成的会话cookie将标记一个到期时间()cookie_lifetime,其中从服务器获取时间. 有可能的是,如果服务器的日期不好,cookie将会立即过期.想象一下:服务器日期2015-01-31,您的浏览器2015-02-01.服务器发送的cookie在2015-01-31晚上11点到期,您的浏览器会收到一个已经过期的cookie. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |