我有一个Web应用程序,在其中可以注销。注销后,该会话即被破坏。由sess_destroy()在system> libraries> Session.php中删除。
但是,只要用户注销,就删除与该用户相对应的令牌,而是在会话表中创建没有任何用户数据的新令牌。
以下是当我再次将用户重定向到登录页面时所经历的流程,流程如此,
注销->登录页面中的__construct()-> CI_Controller中的__construct()-> Loader.php中的initialize()-> Loader.php中的_ci_autoloader()-> autoload.php中的$ autoload ['libraries'] -> Session.php中的__construct()->
if ( ! $this->sess_read()) {
$this->sess_create();
} else {
$this->sess_update();
}
然后在sess_read()中
$session = $this->CI->input->cookie($this->sess_cookie_name);
// No cookie? Goodbye cruel world!...
if ($session === FALSE)
{
log_message('debug', 'A session cookie was not found.');
return FALSE;
}
在sess_create()中加入另一个,并创建另一个会话,
$this->userdata = array(
'session_id' => md5(uniqid($sessid, TRUE)),
'ip_address' => $this->CI->input->ip_address(),
'user_agent' => substr($this->CI->input->user_agent(), 0, 120),
'last_activity' => $this->now,
'user_data' => ''
);
在创建会话时,会将其分配给cookie,在销毁会话时删除cookie。但是一旦加载了新页面并同时加载了会话库,它将在会话表中插入新行。
这增加了数据库的大小,我希望社区对此事提出建议。还有其他人面临同样的问题吗?
p.s。我正在使用CI2
会话请求,
function sess_destroy()
{
// Kill the session DB row
if ($this->sess_use_database === TRUE && isset($this->userdata['session_id']))
{
$this->CI->db->where('session_id', $this->userdata['session_id']);
$this->CI->db->delete($this->sess_table_name);
}
// Kill the cookie
setcookie(
$this->sess_cookie_name,
addslashes(serialize(array())),
($this->now - 31500000),
$this->cookie_path,
$this->cookie_domain,
0
);
// Kill session data
$this->userdata = array();
}
答案 0 :(得分:0)
这在CI中并不意外,因为只要访问者访问使用会话库的任何内容,都会创建/更新会话。 这些会话为“空”(因为用户未登录)的事实有点无关紧要。您可以定期清空会话表(通过删除所有不包含数据的会话),但是可以节省的空间并不多。
以上所述,如果您想防止自己遇到的问题,而不是破坏会话,只需取消设置其变量,使其变为空即可。
unset ($this->session->userdata);
这样,用户将保持相同的会话cookie,唯一的变化是它将丢失数据库中包含的数据,从而有效地注销用户。
编辑:我对CI 2并不是特别熟悉,因为我的所有代码现在都放在CI3上,而我曾经在CI2上拥有的任何东西早已不复存在。但是看起来您在会话管理上遇到了不必要的麻烦,而不是完全依赖CI的内置功能,这可能有些次优