Php zend服务器中的会话锁定问题

Php zend服务器中的会话锁定问题,php,session,zend-framework,zend-server,zend-session,Php,Session,Zend Framework,Zend Server,Zend Session,我有一个在会话到期前10分钟向登录用户显示警报的功能。如果用户在指定时间内空闲,则在会话到期前10分钟向用户显示确认。如果他希望继续当前会话,他可以这样做,也可以延长会话。因此,我像跟着 //For extending the session expiry public function extendsessionAction(){ $sessTimeOut = 1440; $session = new Zend_S

我有一个在会话到期前10分钟向登录用户显示警报的功能。如果用户在指定时间内空闲,则在会话到期前10分钟向用户显示确认。如果他希望继续当前会话,他可以这样做,也可以延长会话。因此,我像跟着

  //For extending the session expiry
    public function extendsessionAction(){
        $sessTimeOut        = 1440;
        $session            = new Zend_Session_Namespace('Zend_Auth');
        $session->reqTime   = time();
        $session->setExpirationSeconds($sessTimeOut);
        $warnTime           = 3000;
        $session->warnTime  = $warnTime;

        $this->getHelper('viewRenderer')->setNoRender();
        $this->_helper->layout()->disableLayout();
    }
//For checking the session expiry
    public function checksessionexpiryAction(){
        $session            = new Zend_Session_Namespace('Zend_Auth');
        $reqTime            = $session->reqTime;
        $warnTime           = $session->warnTime;
        $sessTimeOut        = 1440;

        if((time() - $reqTime) >= $warnTime){
            echo 'Warning';
        }
        else if((time() - $reqTime) >= $sessTimeOut){
            echo 'Logout';
        }
        else{
            echo 'Continue';
        }

        $this->getHelper('viewRenderer')->setNoRender();
        $this->_helper->layout()->disableLayout();
    }
下面是使用的客户端代码,它写在头模板中,所以它将包含在所有页面中

$(document).ready(function(){
    extendSessionExpiry();
    checkSessionTimeEvent = setInterval("checkSessionExpiry()",8 * 60000);
});

function extendSessionExpiry(){
    $.ajax({
        url     : base_url+'/default/Dashboard/extendsession',
        type    : 'post',
        dataType: 'json',
        success : function(result){
        }
    });
}

function checkSessionExpiry(){
    $.ajax({
        url     : base_url+'/default/Dashboard/checksessionexpiry',
        type    : 'post',
        success : function(result){
            if(result == 'Warning'){
                showSessionWarning();//Will show a popup to continue or extend the session.Extending the session will call extendSessionExpiry()
            }
            else if(result == 'Logout'){
                dontWarn();
                window.location = base_url+'/Index/logout';
            }
        }
    });
}

所以我在我的应用程序中使用zend server。我的问题是,如果在多个选项卡中打开应用程序,它将转到注销。这意味着会话即将过期。我听说这与zend Sever会话群集锁定机制有关。有人能解释一下excat的问题是什么吗。

不应该自动转到注销。。服务器不知道您打开了另一个窗口/选项卡,因此它将对它们一视同仁

我假设您已经测试过它是否能够独立工作,比如在打开新选项卡之前刷新页面?然后在打开新选项卡时?您是否尝试过实现一种方法来显示他们在刷新页面时剩余的时间。。。甚至是一个自动售票机


我从未听说过Zend因选项卡而终止会话。

它不应该自动转到注销。。服务器不知道您打开了另一个窗口/选项卡,因此它将对它们一视同仁

我假设您已经测试过它是否能够独立工作,比如在打开新选项卡之前刷新页面?然后在打开新选项卡时?您是否尝试过实现一种方法来显示他们在刷新页面时剩余的时间。。。甚至是一个自动售票机


我从来没有听说过Zend会因为选项卡而终止会话。

当为登录用户启动会话时(例如在登录操作中),会在会话中设置变量“reqTime”?不像@Alexander那样。登录后,无论何时用户刷新任何页面,该时间都将设置为
reqTime
。因此,当登录用户启动会话时(例如在登录操作中),将在会话中设置变量“reqTime”?与@Alexander不同。登录后,每当用户刷新任何页面时,该时间将被设置为
reqTime
。因此,用户在登录后不会刷新该时间。每次加载页面时,我都会将该ajax发送到服务器以更新上次请求时间。因此,每次服务器都会知道该时间并在会话中更新请求时间。以及它不是关于
Zend由于选项卡而终止会话
它是关于Zend服务器中的会话群集锁定这是正确的,但是,服务器不知道您打开了另一个选项卡或窗口。据它所知,您刚刚单击了一个新链接。显然是的。但是,由于有太多的请求同时发送到服务器,并且每个请求都试图将一些数据写入同一个会话变量,所以问题就出现了。因为每次数据写入会话时,它都会将会话锁定到先前的数据损坏。这可能是问题所在问题。每次加载页面时,我都会将该ajax发送到服务器,以更新上次请求时间。因此,每次服务器都会知道它并在会话中更新请求时间。这不是关于
Zend由于选项卡而终止会话,而是关于Zend服务器中的会话群集锁定,这是正确的,服务器不知道您已打开另一个选项卡或窗口。据它所知,您刚刚单击了一个新链接。显然是的。但是,由于有太多的请求同时发送到服务器,并且每个请求都试图将一些数据写入同一个会话变量,所以问题就出现了。因为每次数据写入会话时,它都会将会话锁定到先前的数据损坏。这可能是问题所在问题