在我的config.php
中,我的配置文件中与会话相关的配置如下所示;
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 1800; //30 minutes
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie'] = FALSE;
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'rd_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 300;
对于网站的正常使用,登录半小时后会话将过期。然而,我在我的网站上有一个功能,用户可以玩基于定时器的任务。例如,当用户单击一个按钮时,计时器启动,他在一段时间后完成某项任务,完成后,他单击停止按钮,计时器停止,时间保存在数据库中。
这里的问题是,任务可能会暂停30分钟以上,所以当用户播放计时器时,会话就会过期。我不能在配置中更改sess过期时间,因为对于其他用户(没有玩定时器),它应该在30分钟后超时。因此,正如其他线程中所建议的那样,当用户启动计时器时,我会调用ajax来动态更改sess过期时间。这是一种被称为-的方法
public function sessiontimeout($time){
$session_lifetime = $time > 0 ? $time: 864000;
$this->config->set_item('sess_expiration', $session_lifetime);
echo "Session lifetime set to ".$this->config->item("sess_expiration")." seconds";
exit;
}
然而,这并没有起作用,用户会在30分钟内注销。我如何做到这一点?当单击计时器时,ajax调用会延长现有的超时时间,当计时器停止时,会话过期时间会重置为30分钟。
感谢
唯一有效的是,我每2分钟进行一次ajax调用,并检查会话是否会过期。我在会话到期前5分钟重置了会话。代码
Javascript ajax调用。
var sessionTimer = setInterval(function(){
$.ajax({
url: '/ajax/sessiontimeout',
beforeSend: function(){},
success: function(data){
console.info(data);
}
});
},120000);
和控制器方法
public function sessiontimeout(){
$lastActivity = $this->session->userdata('last_activity');
$configtimeout = $this->config->item("sess_expiration");
$sessonExpireson = $lastActivity+$configtimeout;
$threshold = $sessonExpireson - 300; //five minutes before session time out
$current_time = time();
if($current_time>=$threshold){
$this->session->set_userdata('last_activity', time()); //THIS LINE DOES THE TRICK
echo "Session Re-registered";
}else{
echo "Not yet time to re-register";
}
exit;
}
嗨,您不需要更改配置文件。您只需在一个时间间隔后运行一个ajax到您的any after-logged控制器函数
意味着我们正在通过ajax请求访问登录后的url。codeigniter自动更新当前登录用户会话。这很简单