【发布时间】:2016-06-17 17:33:24
【问题描述】:
我有一个在 LAMP 上运行的 Codeigniter APP。我有一个奇怪的问题,Codeigniter 会以某种方式破坏会话并在 AJAX 调用期间生成一个新的会话 ID。问题是我已经将$config['sess_expiration'] 设置为0。在session.php 中,我更改了session_update 中的代码,
function sess_update()
{
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
{
return;
}
$old_sessid = $this->userdata['session_id'];
// Pass old session id to new session id directly
$new_sessid = $old_sessid;
$this->userdata['last_activity'] = $this->now;
// _set_cookie() will handle this for us if we aren't using database sessions
// by pushing all userdata to the cookie.
$cookie_data = NULL;
// Update the session ID and last_activity field in the DB if needed
if ($this->sess_use_database === TRUE)
{
// set cookie explicitly to only have our session data
$cookie_data = array();
foreach (array('session_id','ip_address','user_agent','last_activity') as $val)
{
$cookie_data[$val] = $this->userdata[$val];
}
$this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));
}
// Write the cookie
$this->_set_cookie($cookie_data);
}
无论是否是“要更新的会话”,会话 ID 都应该始终相同,因为我只是将旧会话 ID 传递给新会话 ID。以下是我的配置设置:
$config['sess_cookie_name'] = 'test';
$config['sess_expiration'] = 0;
$config['sess_expire_on_close'] = TRUE;
$config['sess_encrypt_cookie'] = TRUE;
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'ci_sessions_dev';
$config['sess_match_ip'] = FALSE;
$config['sess_match_useragent'] = FALSE;
$config['sess_time_to_update'] = 3; //the problem happens no matter this value is 3 or 30000
并且在日志中,当我登录后服务器将我踢出时,我可以看到日志:
DEBUG - 2016-03-06 13:48:17 --> A session cookie was not found.
有时会发生此问题,有时会整天工作。我在 FF、IE、Chrome 中遇到了这个问题。任何想法?提前谢谢你
【问题讨论】:
标签: php codeigniter session