Rey*_*rPM 8 php ajax session symfony
如果用户在10分钟内不执行任何操作,我已将应用程序配置为在超时时关闭会话.在config.yml我有这样的:
session:
handler_id: ~
cookie_lifetime: 600 # 10 minutes
gc_maxlifetime: 600 # 10 minutes
gc_probability: 1
gc_divisor: 1
Run Code Online (Sandbox Code Playgroud)
我每隔一分钟进行一次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);
}
Run Code Online (Sandbox Code Playgroud)
由于一些不知情的原因不起作用,每10分钟会话都关闭,无论我是在使用页面还是不在,为什么?我错过了什么?
编辑1尝试新值,仍然无效:
session:
handler_id: ~
cookie_lifetime: 1800
gc_maxlifetime: 600
gc_probability: 1
gc_divisor: 100
Run Code Online (Sandbox Code Playgroud)
当我在页面上工作,执行Ajax调用和一些其他任务时,会话已关闭,因此无法正常工作.显然对我来说唯一有用的价值就是设置cookie_lifetime: 86400 #1 day,这对我来说很疯狂!
编辑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
Run Code Online (Sandbox Code Playgroud)
我也通过启用ntpd服务来修复VM上的日期/时间,现在日期很好:
[root@webvm var]# date
Sun Feb 1 18:35:17 VET 2015
Run Code Online (Sandbox Code Playgroud)
但是5分钟后(函数调用执行了5次)会话还活着.这就是我isLoggedInAction()从Javascript方面调用函数的方法:
$.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, jqXHR){
if( data.authenticated ){
var timer = window.setInterval(function(){
$.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, 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(){});
Run Code Online (Sandbox Code Playgroud)
见下图:

测试3
在说完所有工作正常后,我做了最新的确定性测试:打开应用程序并在整个晚上(几乎8小时)保持不动,并且惊讶它永远不会关闭会话.如下图所示,看看页面有多少请求,看看会话还活着,为什么?

每隔一段时间进行Ajax调用:10.5分钟
$.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, jqXHR){
if( data.authenticated ){
var timer = window.setInterval(function(){
$.post(Routing.generate('isLoggedIn',{}),{},'json').done(function (data, textStatus, 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(){});
}, 210000);
}
}).fail(function(){});
Run Code Online (Sandbox Code Playgroud)
设置说会话应该过期:10分钟.
session:
handler_id: ~
cookie_lifetime: 630000
gc_maxlifetime: 630000 # session will expire after 10 minutes of inactivity
gc_probability: 1
gc_divisor: 100
Run Code Online (Sandbox Code Playgroud)
服务器的时间很好:
[root@webvm sencamer.dev]# date
Mon Feb 2 07:26:53 VET 2015
Run Code Online (Sandbox Code Playgroud)
我还应该检查什么?
测试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
Run Code Online (Sandbox Code Playgroud)
另外,如果您使用的是虚拟机,请检查服务器的日期,生成的会话 cookie 将标有time() + cookie_lifetime从服务器获取的时间的到期时间。
如果服务器的日期错误,cookie 可能会立即过期。想象一下:服务器日期2015-01-31,您的浏览器2015-02-01。服务器发送的 cookie 将于2015-01-31晚上 11 点过期,您的浏览器收到的 cookie 的过期日期已过。