codeigniter会话经常过期

时间:2011-07-28 09:44:03

标签: codeigniter session

我正在为我的应用程序使用codeigniter

我的问题是会话即使用户在网站上处于活动状态也会过期。

这些是会话设置..我正在使用数据库会话

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

任何解决方案。

帮助我,我必须解决它

这是codeigniter forum link

5 个答案:

答案 0 :(得分:12)

我遇到CI会话随机到期的问题。您是否有加载会话库的AJAX或动态资源?如果是这样,想象一下这种情况:

我提交了一个ajax请求(使用cookie传递我的CI会话ID),然后返回结果,但我还提交了一些其他请求(加载动态图像,另一个AJAX请求等)紧接着第一个请求。第一个请求可能会触发300秒“更新时间”事件,并传回一个新cookie,但附加请求是发送旧会话ID,对吗?

所以,CodeIgniter说“嘿,你不能这样做”并创建一个新会话,使两个cookie无效,我的浏览器现在不知道该怎么做。

这是我在一段时间后发布的论坛链接,其中包含更多细节: http://codeigniter.com/forums/viewthread/172415/

答案 1 :(得分:3)

正如第一个答案中所提到的,会话库中存在一种竞争条件,此后在最新版本的CodeIgniter中有所缓解,包括'develop'分支。这实现了对会话轮换的isAjax检查,但它并没有真正解决潜在的问题。

答案 2 :(得分:2)

你确定会话被破坏了吗?我认为它不是按照假设进行更新,而是在每个页面请求上创建一个新的。 (常见的Codeigniter设置问题)

这是我的建议:

仔细检查您的Application / Config / config.php文件,以确保如果您在主目录中托管该站点,会话域的部分就是这样:

$config['cookie_prefix']    = "";
$config['cookie_domain']    = "yourdomain.com";
$config['cookie_path']  = "var/sessions/";
$config['cookie_secure']    = FALSE;

并且如果您将站点托管在子目录中,那就像这样:

$config['cookie_prefix']    = "";
$config['cookie_domain']    = "yourdomain.com";
$config['cookie_path']  = "siteSubDirectory/var/sessions/";
$config['cookie_secure']    = FALSE;

并确保通过将其权限修复为755左右来确保2个目录是可写的,我强烈建议您启用数据库会话,它更安全,并通过检查会话表帮助您找出真正的问题。祝你好运:)

答案 3 :(得分:2)

我将为此问题添加解决方法。 如果进行了ajax调用,则不要更新会话 通过将此文件添加到libraries文件夹来扩展会话类:

    class MY_Session extends CI_Session {

    // --------------------------------------------------------------------

    /**
     * sess_update()
     *
     * @access    public
     * @return    void
     */
    public function sess_update()
    {
        $CI =& get_instance();

        if ( ! $CI->input->is_ajax_request())
        {
            parent::sess_update();
        }
    }

}

答案 4 :(得分:1)

只需将ci_sessions表编码更改为MyISAM: ALTER TABLE {ci_sessions {1}}