【问题标题】:CodeIgniter Session Expire in Config file配置文件中的 CodeIgniter 会话过期
【发布时间】:2012-02-06 21:55:33
【问题描述】:

我正在开发 CodeIgniter 框架。

我想要的是将站点的会话到期时间设置为 3 小时,即(3600*3=10800 秒)。

但是当我在 config.php 中设置$config['sess_expiration'] = 10800; 时,会话在空闲大约 30 分钟内到期并被重定向到登录页面。

为什么会这样?

这些是我在配置中的一些会话设置

  $config['sess_cookie_name']     = 'ci_session';
   $config['sess_expiration']      = 10800;
      $config['sess_encrypt_cookie']  = FALSE;
  $config['sess_use_database']    = TRUE;
  $config['sess_table_name']      = 'ci_sessions';
  $config['sess_match_ip']        = FALSE;
  $config['sess_match_useragent'] = TRUE;
  $config['sess_time_to_update']  = 300;

【问题讨论】:

  • 感谢 Colin 正确编辑问题。
  • 有人对这个话题感兴趣吗?
  • 您是否使用数据库进行会话?
  • 我尝试将“关闭时会话过期”设置为 TRUE,并给出 $config['sess_expiration'] = 10;然后它工作了 10 秒,但如果我给 10800 秒,它会在 30 分钟内过期
  • @tpae $config['sess_use_database'] = TRUE;

标签: codeigniter session


【解决方案1】:

php.ini 中检查session.gc_lifetime 的配置。

默认情况下,这是 1440 或 24 分钟。这意味着每当 PHP 的垃圾收集器运行时(它会在每次页面加载时以配置的概率执行此操作),任何超过 24 分钟的会话都将通过 CodeIgniter 会话驱动程序中的gc() 函数清除。

【讨论】:

    【解决方案2】:

    确保您的数据库中有 ci_sessions 表。

    CREATE TABLE IF NOT EXISTS  `ci_sessions` (
        session_id varchar(40) DEFAULT '0' NOT NULL,
        ip_address varchar(16) DEFAULT '0' NOT NULL,
        user_agent varchar(120) NOT NULL,
        last_activity int(10) unsigned DEFAULT 0 NOT NULL,
        user_data text NOT NULL,
        PRIMARY KEY (session_id),
        KEY `last_activity_idx` (`last_activity`)
    );
    

    编辑:另外,请确保您没有使用 $_SESSION$this->session->set_userdata($array);

    链接: http://codeigniter.com/user_guide/libraries/sessions.html

    【讨论】:

    • 我会检查一下,谢谢,但目前我无法检查数据库,我会在 2 小时内检查它,这也可能是唯一出现的问题
    • 如果您使用的是最新的 CodeIgniter,并且这是您的配置,那么可以。我没有看到任何其他问题。如果您不确定是否有 ci_sessions 表,那可能就是问题所在。如果没有,请尝试禁用使用数据库功能,并尝试使用 cookie。
    • CodeIgniter 并没有真正安装,但在手册的深处,他们在这里谈论 ci_sessions 表:codeigniter.com/user_guide/libraries/sessions.html
    • 如何使用 cookie 来完成,可以将其写入配置文件并检查吗? @tpae
    • 如果您将 sess_use_database 设置为 FALSE,它将回退到 cookie
    【解决方案3】:

    像这样检查代码:

    if($login)
    {
       $this->session->sess_expire_on_close = TRUE;
    }
    else
    {
       $this->session->sess_expiration = 60*60*3;
       $this->session->sess_expire_on_close = FALSE;
    }
    
      $this->session->set_userdata('your_item'); 
    

    【讨论】:

    • 会在哪个控制器文件中?
    • 我应该在所有的控制器文件中提供这个吗? @Valeh
    • 在您设置会话数据的控制器中:) 所以,这取决于您的代码。顺便说一句,这只是过程的逻辑。你必须写你的值而不是 $login 和 'your_item'。
    • 其中一个控制器内部有登录检查功能,所以我应该使用上面的代码吧?
    • 那么配置页面中会话过期变量的值呢?
    猜你喜欢
    • 2013-04-03
    • 2011-11-29
    • 2013-04-04
    • 2011-10-23
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多