Php 如何防止codeigniter中的自动注销?
我正在使用Php 如何防止codeigniter中的自动注销?,php,mysql,codeigniter,ion-auth,Php,Mysql,Codeigniter,Ion Auth,我正在使用codeigniter 配置了ion\u auth和MySQL作为后端, 我的应用程序运行平稳,但有时/不随机,当我调用add/update函数时,它会自动将我注销。 我在过去的一个月里一直在努力,但到目前为止还没有找到解决方案? 我还更改了ion\u authconfig文件中的设置 $config['user_expire'] = 0; 有什么办法解决这个问题吗 请评论,以便我可以提供更多的数据,如果需要的话 注意:我也进行了检查,但运气不佳。您可能正在执行ajax请求,这是一
codeigniter
配置了ion\u auth
和MySQL作为后端,
我的应用程序运行平稳,但有时/不随机,当我调用add/update
函数时,它会自动将我注销。
我在过去的一个月里一直在努力,但到目前为止还没有找到解决方案?
我还更改了ion\u auth
config文件中的设置
$config['user_expire'] = 0;
有什么办法解决这个问题吗请评论,以便我可以提供更多的数据,如果需要的话
注意:我也进行了检查,但运气不佳。
您可能正在执行ajax请求,这是一个常见问题 我建议您使用会话数据库并进行ajax调用是为了不更新会话 在课堂上做这个
class MY_Session extends CI_Session {
public function sess_update()
{
$CI =& get_instance();
if ( ! $CI->input->is_ajax_request())
{
parent::sess_update();
}
}
}
替换system/libraries/Session.php(函数sess_update())中的第346行 与:
希望这对您有用。使用您自己的
MY_session.php
库创建一个会话库,该库重写了sess_update
方法,其中一个仅在非AJAX请求时执行update方法:
MY_Session.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once BASEPATH . '/libraries/Session.php';
class MY_Session extends CI_Session
{
function __construct()
{
parent::__construct();
$this->CI->session = $this;
}
function sess_update()
{
// Do NOT update an existing session on AJAX calls.
if (!$this->CI->input->is_ajax_request())
return parent::sess_update();
}
}
或者,您可以稍后加载:
$this->load->library('MY_Session');
此sess_更新的内容();是吗?
在您的系统/libraries/Session.php
中有一个函数sess_update()
,该函数自动更新您的上一个活动。默认情况下,该函数每五分钟更新一次会话
public function sess_update()
{
// We only update the session every five minutes by default
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
{
return;
}
// _set_cookie() will handle this for us if we aren't using database sessions
// by pushing all userdata to the cookie.
$cookie_data = NULL;
/* Changing the session ID during an AJAX call causes problems,
* so we'll only update our last_activity
*/
if ($this->CI->input->is_ajax_request())
{
$this->userdata['last_activity'] = $this->now;
// 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->userdata['last_activity']),
array('session_id' => $this->userdata['session_id'])));
}
return $this->_set_cookie($cookie_data);
}
// Save the old session id so we know which record to
// update in the database if we need it
$old_sessid = $this->userdata['session_id'];
$new_sessid = '';
do
{
$new_sessid .= mt_rand(0, mt_getrandmax());
}
while (strlen($new_sessid) < 32);
// To make the session ID even more secure we'll combine it with the user's IP
$new_sessid .= $this->CI->input->ip_address();
// Turn it into a hash and update the session data array
$this->userdata['session_id'] = $new_sessid = md5(uniqid($new_sessid, TRUE));
$this->userdata['last_activity'] = $this->now;
// 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);
}
public function sess_update()
{
//默认情况下,我们仅每五分钟更新一次会话
如果($this->userdata['last\u activity']+$this->sess\u time\u to\u update)>=$this->now)
{
返回;
}
//如果我们不使用数据库会话,则\u set\u cookie()将为我们处理此问题
//通过将所有用户数据推送到cookie。
$cookie_data=NULL;
/*在AJAX调用期间更改会话ID会导致问题,
*因此,我们将只更新上次的活动
*/
如果($this->CI->input->is\u ajax\u request())
{
$this->userdata['last_activity']=$this->now;
//如果需要,更新数据库中的会话ID和最后一个活动字段
如果($this->sess\u use\u database===TRUE)
{
//将cookie显式设置为仅包含会话数据
$cookie_data=array();
foreach(数组('session_id'、'ip_address'、'user_agent'、'last_activity')为$val)
{
$cookie_data[$val]=$this->userdata[$val];
}
$this->CI->db->query($this->CI->db->update\u string($this->sess\u table\u name),
数组('last_activity'=>this->userdata['last_activity']),
数组('session\u id'=>this->userdata['session\u id']);
}
返回$this->\u set\u cookie($cookie\u数据);
}
//保存旧会话id,以便我们知道要保存哪个记录
//如果需要,请在数据库中进行更新
$old_sessiond=$this->userdata['session_id'];
$new_sessiond='';
做
{
$new_sessiond.=mt_rand(0,mt_getrandmax());
}
而(strlen($new_sessiond)<32);
//为了使会话ID更加安全,我们将它与用户的IP相结合
$new_sessiond.=$this->CI->input->ip_address();
//将其转换为哈希并更新会话数据数组
$this->userdata['session\u id']=$new\u sessiond=md5(uniqid($new\u sessiond,TRUE));
$this->userdata['last_activity']=$this->now;
//如果需要,更新数据库中的会话ID和最后一个活动字段
如果($this->sess\u use\u database===TRUE)
{
//将cookie显式设置为仅包含会话数据
$cookie_data=array();
foreach(数组('session_id'、'ip_address'、'user_agent'、'last_activity')为$val)
{
$cookie_data[$val]=$this->userdata[$val];
}
$this->CI->db->query($this->CI->db->update_string($this->sess_table_name,数组('last_activity'=>this->$now,'session_id'=>$new_sessiond),数组('session_id'=>$old_sessiond));
}
//写曲奇
$this->\u set\u cookie($cookie\u数据);
}
这是最好的答案
codeignter controller
function fetchSendToProduction($sku,$old_fab_id)
{
if($this->input->is_ajax_request() > 0)
{
$result = $this->ifmodel->fetchSendToProduction($sku,$old_fab_id);
echo json_encode($result);
}
}
codeignter view ajax call
$.ajax({
type: "POST",
url: "<?php echo base_url(); ?>index.php/inputFactor/fetchSendToProduction/" + sku+'/'+old_fab_id ,
cache: false,
processData: false,
success: function(data)
{
}
});
codeigner控制器
函数fetchSendToProduction($sku、$old\U fab\U id)
{
如果($this->input->is\u ajax\u request()>0)
{
$result=$this->ifmodel->fetchSendToProduction($sku,$old\u fab\u id);
echo json_编码($result);
}
}
codeignter视图ajax调用
$.ajax({
类型:“POST”,
url:“index.php/inputFactor/fetchSendToProduction/”+sku+'/'+old_fab_id,
cache:false,
processData:false,
成功:功能(数据)
{
}
});
这可能是另一回事,我的应用程序不会随机注销,但每天至少会注销1到2次。是的,我正在使用ajax,但是,如果我写如果(!$this->CI->input->is_ajax_request())返回parent::sess_update(),我也会注销那些我没有使用ajax的页面呢代码>在session.php构造函数中?它会工作吗?是的,它会工作。如果您遇到任何错误,请告诉我。在C:\xampp\htdocs\projects\oinvoices\system\libraries\Session.php的第59行
检查是否设置了带有服务器头的HTTP\u REQUESTED\u请求函数is\u ajax\u request()为空,如果是,则返回布尔值TRUE;如果不是,则返回布尔值FALSE。如何设置,我不知道
$this->load->library('MY_Session');
public function sess_update()
{
// We only update the session every five minutes by default
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
{
return;
}
// _set_cookie() will handle this for us if we aren't using database sessions
// by pushing all userdata to the cookie.
$cookie_data = NULL;
/* Changing the session ID during an AJAX call causes problems,
* so we'll only update our last_activity
*/
if ($this->CI->input->is_ajax_request())
{
$this->userdata['last_activity'] = $this->now;
// 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->userdata['last_activity']),
array('session_id' => $this->userdata['session_id'])));
}
return $this->_set_cookie($cookie_data);
}
// Save the old session id so we know which record to
// update in the database if we need it
$old_sessid = $this->userdata['session_id'];
$new_sessid = '';
do
{
$new_sessid .= mt_rand(0, mt_getrandmax());
}
while (strlen($new_sessid) < 32);
// To make the session ID even more secure we'll combine it with the user's IP
$new_sessid .= $this->CI->input->ip_address();
// Turn it into a hash and update the session data array
$this->userdata['session_id'] = $new_sessid = md5(uniqid($new_sessid, TRUE));
$this->userdata['last_activity'] = $this->now;
// 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);
}
codeignter controller
function fetchSendToProduction($sku,$old_fab_id)
{
if($this->input->is_ajax_request() > 0)
{
$result = $this->ifmodel->fetchSendToProduction($sku,$old_fab_id);
echo json_encode($result);
}
}
codeignter view ajax call
$.ajax({
type: "POST",
url: "<?php echo base_url(); ?>index.php/inputFactor/fetchSendToProduction/" + sku+'/'+old_fab_id ,
cache: false,
processData: false,
success: function(data)
{
}
});