Yii用户在15-30分钟后退出,尽管会话超时设置为至少1天

时间:2012-10-12 12:42:03

标签: php session cookies yii session-timeout

我在下面列出了Yii配置文件的相关部分:

return array(
...
    'components'=>array(
        'session' => array(
            'timeout' => 86400,
        ),
        'user'=>array(
            'allowAutoLogin' => true,
            'autoRenewCookie' => true,
            'authTimeout' => 31557600,
        ),
    ...
    ),
...
);

我也进入了php.ini并设置了session.gc_maxlifetime = 86400,但这仍然没有解决问题。

目前,我绝对不知道还有什么可能导致它超时并在大约15-30分钟不活动后将用户退出。理想情况下,用户应保持登录状态至少一天不活动(除了关闭浏览器窗口,允许浏览器首选项)。

我已经拖网了谷歌,Yii和堆栈溢出,只是找不到任何我忽略的东西......但显然我忽略了一些东西。如果有人能帮助我,我会非常感激。


我们要求提供用于登录用户的典型代码示例,其中包含以下内容:

$identity = new UserIdentity('facebook', $id, $user->name, $user->email);
$loggedIn = Yii::app()->user->login($identity);
$this->subscriptionChecker->updateCurrentUserSubscribed();

这是Yii::app()->user->login()被称为

的任何时候都很典型

从Chrome,以下是我对该网站的Cookie及其到期日期(清除所有Cookie并登录后):

PHPSESSID expires When the browsing session ends

// I'm informed these are set by google analytics  
__utma created Friday, 12 October 2012 14:05:31 expires Sunday, 12 October 2014 14:05:31

__utmb created Friday 12 October 2012 14:05:31 expires Friday 12 October 2012 14:35:31,

__utmc created Friday, 12 October 2012 14:05:31 expires When the browsing session ends

__utmz created Friday 12 October 2012 14:05:31 expires Saturday 13 April 2013 02:05:31  
// end google analytics

5 个答案:

答案 0 :(得分:15)

http://www.yiiframework.com/doc/api/1.1/CWebUser#login-detail

感谢Arfeen的帮助,他指出了我正确的方向,除非你设置Yii::app()->user->login()的第二个参数,结果是Yii不会使用持久性cookie,因为第二个参数默认为0。 0值会覆盖您可能设置的超时其他任何内容。

答案 1 :(得分:1)

试试这个: 第一 登录后,您可以设置 setState 这个:

yii::app()->user->setState('userSessionTimeout', time() + Yii::app()->params['sessionTimeoutSeconds']); 

添加文本companents.controller.php

 public function beforeAction(){
            // Check only when the user is logged in
            if ( !Yii::app()->user->isGuest)  {
               if ( yii::app()->user->getState('userSessionTimeout') < time() ) {
                   // timeout
                   Yii::app()->user->logout();
                   $this->redirect(array('/site/login'));  //
               } else {
                   yii::app()->user->setState('userSessionTimeout', time() + Yii::app()->params['sessionTimeoutSeconds']) ;
                   return true; 
               }
            } else {
                return true;
            }
        }

并在config main.php文件中添加:

  

&#39; params&#39; =&gt;数组(&#39; sessionTimeoutSeconds&#39; =&gt; 1800,// 30分钟),

答案 2 :(得分:1)

我有一个相同的问题,即使我使用authTimeout 3600 * 24(24小时),用户仍然在大约30分钟内注销。 我发现在php.ini上有一个选项:

  

的session.gc_maxlifetime

默认情况下,此选项为24分钟,因此我根据需要进行了更改

  

session.gc_maxlifetime = 86400

24小时。问题解决了我。

希望这可以帮助别人!

答案 3 :(得分:0)

对于Yii2

登录会话cookie后的此解决方案设置在7天后过期时间:

'components' => [
    'session' => [
        'class' => 'yii\web\Session',
        'cookieParams' => ['lifetime' => 7 * 24 *60 * 60]
    ],

答案 4 :(得分:-2)

适用于Yii2版本

在/config/params.php中设置超时秒数:

'sessionTimeoutSeconds' => '1800',

在您的controllers / SiteController.php中,actionLogin()方法添加以下内容:

// Set the user session timeout
Yii::$app->session->set('userSessionTimeout', time() + Yii::$app->params['sessionTimeoutSeconds']);

还在SiteController.php中添加beforeAction方法

public function beforeAction($action)
{

    if (!parent::beforeAction($action)) {
        return false;
    }

    // Check only when the user is logged in
    if ( !Yii::$app->user->isGuest)  {
        if (Yii::$app->session['userSessionTimeout'] < time()) {
            Yii::$app->user->logout();
        } else {
            Yii::$app->session->set('userSessionTimeout', time() + Yii::$app->params['sessionTimeoutSeconds']);
            return true; 
        }
    } else {
        return true;
    }
}

在你的views / layouts / main.php中:在head DOM之间添加自动刷新标头,将app发送回登录视图。

<? if (!Yii::$app->user->isGuest) { ?>
            <meta http-equiv="refresh" content="<?php echo Yii::$app->params['sessionTimeoutSeconds'];?>;"/>
<? } ?>