Codeigniter会话频繁过期



我使用codeigniter为我的应用程序

我的问题是会话过期,即使用户是活跃在网站上。

这些是会话设置。我正在使用DB会话

$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论坛链接

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

我提交了一个ajax请求(它通过我的CI会话id与cookie),它返回结果,但我也提交了一些其他请求(加载动态图像,另一个ajax请求等),立即跟随第一个请求。第一个请求可能会触发300秒的"该更新了"事件,并传回一个新的cookie,但是附加的请求发送的是旧的会话id,对吗?

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

这是我之前发布的一个论坛链接,它更详细:http://codeigniter.com/forums/viewthread/172415/

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

您确定会话已被销毁吗?我认为它只是没有像预期的那样更新,它在每个页面请求上都创建了一个新的。(常见的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左右,我强烈建议您启用数据库会话,这更安全,并将帮助您通过检查会话表找到真正的问题。祝你好运!

我将为这个问题添加一个解决方案。如果进行了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();
        }
    }
}

将ci_sessions表的编码改为MyISAM:ALTER TABLE ci_sessions ENGINE = MyISAM;

删除config.php

$config['cookie_path']      = '/';

您可能需要在/application/config/config.php

中设置cookie域。
  PHP Code:
    $config['cookie_prefix']   = '';
    $config['cookie_domain']   = '.domainname.com';
    $config['cookie_path']     = '/';
    $config['cookie_secure']   = FALSE;
    $config['cookie_httponly'] = FALSE;

cookie_domain作为你的主机名,这解决了我的会话过期问题

最新更新