php - 即使我正在工作, session 也会过期, session 生命周期,Ajax 和 Symfony2

标签 php ajax symfony session

如果用户在 10 分钟内什么都不做,我已经将我的应用程序配置为在超时时关闭 session 。在 config.yml 我有这个:

session:
    handler_id:  ~
    cookie_lifetime: 600 # 10 minutes
    gc_maxlifetime: 600 # 10 minutes
    gc_probability: 1
    gc_divisor: 1

我每隔一分钟执行一次 Ajax 调用以检查 session 是否即将过期,这就是我检查的内容:

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 分钟 session 就会关闭,为什么?我错过了什么?

编辑 1 尝试了新值,但仍然无效:

session:
    handler_id:  ~
    cookie_lifetime: 1800
    gc_maxlifetime: 600
    gc_probability: 1
    gc_divisor: 100

当我在页面上工作、执行 Ajax 调用和其他一些任务时, session 已关闭,因此无法正常工作。到目前为止,显然对我有用的唯一值是设置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

我还通过启用 ntpd 服务修复了 VM 上的日期/时间,现在日期就可以了:

[root@webvm var]# date
 Sun Feb  1 18:35:17 VET 2015

但是 5 分钟后(函数调用执行了 5 次) session 仍然存在。这就是我从 Javascript 端调用函数 isLoggedInAction() 的方式:

$.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(){});

见下图:

enter image description here

测试 3

在说一切正常之后,我进行了最新的确定性测试:打开应用程序并在整个晚上(将近 8 小时)保持原样,令人惊讶的是它从未关闭 session 。如下图所示,查看页面执行了多少请求并查看 session 如何仍然存在,为什么?

enter image description here

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(){});

设置表明 session 应该在 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

好吧,我还在做测试,因为这不是一个好的行为。所以,这就是我为这个测试所做的:

  • 打开应用程序并开始处理
  • 在某个时刻停止工作并离开应用程序进行 Ajax 调用以检查 session 是否仍然存在。 ( session 仍然存在,请参见下图)
  • 在第一次通话后,我继续处理应用程序,如图像 2 所示,但出乎意料的是 session 结束了,应用程序也接近尾声了。

为什么?是什么导致了这种行为?根据我的参数,这是正确的吗?

此图像显示了对该函数的第一次也是唯一一次调用

enter image description here

通话结束后我继续工作,但 session 关闭

enter image description here

最佳答案

首先,注意你的 gc_probabilitygc_divisor .如果两者都设置为 1,则意味着垃圾收集器 (GC) 进程在每次 session 初始化时启动的概率为 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

此外,如果您使用的是虚拟机,请检查您的服务器的日期,生成的 session cookie 将被标记为 time() + cookie_lifetime 的到期时间。从服务器获取时间的地方。

如果服务器日期错误,cookie 可能会立即过期。想象一下:服务器日期 2015-01-31 , 你的浏览器 2015-02-01 .服务器发送在 2015-01-31 过期的 cookie晚上 11 点,您的浏览器会收到一个过期日期已过的 cookie。

关于php - 即使我正在工作, session 也会过期, session 生命周期,Ajax 和 Symfony2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28239583/

相关文章:

javascript - 解析 xml 现在给我一个错误

php - Laravel 验证 : Validating OR instead of AND

php - 如何使用 PHP 发送带附件的电子邮件?

php - 您的 SQL 语法有误;查看与您的 MySQL 服务器对应的手册

PHP - 阻止 IP 24 小时

php - 如何模拟您正在使用 Prophecy 测试的类中的方法?

javascript - Ajax 成功功能无法正常工作

jquery - 使用 jquery .serialize() 进行解码

Symfony 3.0 netbeans 配置

php - 如何摆脱 GET 请求的 "You must configure the check path to be handled by the firewall"错误?