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)
                       {
          }
                     });