在我的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分钟后超时。因此,正如other thread中所建议的那样,当用户启动计时器时,我会进行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分钟。
由于
答案 0 :(得分:2)
您好,您不需要更改配置文件。您只需在时间间隔后运行ajax,即可记录任何后续控制器功能。
意味着我们通过ajax请求访问登录后的url。 codeigniter自动更新当前登录用户会话。那很简单
答案 1 :(得分:2)
唯一有用的是,我每隔2分钟拨打一次ajax电话,然后检查会话是否会过期。我在会议到期前5分钟重置会议。代码
Javascript ajax call。
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;
}