我使用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作为你的主机名,这解决了我的会话过期问题