CodeIgniter应用程序中的AJAX请求在不活动后失败

时间:2013-12-17 08:15:40

标签: php jquery ajax codeigniter

我正在处理的应用程序是在CodeIgniter中构建的,内容总是通过ajax加载到主内容div中。

除了用户暂时不活动之外,这通常可以正常工作。

我们还没有完全缩小请求失败所需的非活动时间,但是大约40分钟或更长时间不活动。

我已经尝试在AJAX请求的错误回调中将详细信息记录到控制台,但没有记录任何内容。

我认为这与会话到期有关,但我无法确定。我知道在使用CodeIgniter时,有两个会话是自动创建的(PHPSESSID和ci_session)所以我的直觉是它与这些会话有关,或其中一个会议到期?

当请求失败时,chrome的开发人员工具上的标题,预览,响应和cookie选项卡都不会显示任何内容。

如果有人以前经历过这个,或者有什么想法可能导致问题,我会很感激你的意见。

修改

以下是遇到上述问题的AJAX请求。

我的应用程序中的所有链接都使用此loadPage函数而不是标准重定向。

function loadPage(href, type, clickElem, changeHash) {
    if(ajax_loading == true) { return false; }
    ajax_loading = true;
    $('#recording_area').slideUp('slow');
    if(typeof queue_countdown !== 'undefined') { clearInterval(queue_countdown); }
    if(type == 'sidenav') {
        $('#sidenav_accordion .accordion-heading a').removeClass('on');
        $('#sidenav_accordion .accordion-inner a').removeClass('on');
        $(clickElem).parents('.accordion-group').find('.accordion-heading a').addClass('on');
        $(clickElem).addClass('on');
    } else {
        page_requested = href.replace(/^\/([^\/]*).*$/, '$1');
        if(!page_requested) { page_requested = 'dashboard'; }
        nav_elem = $('.sidenav a[href="/' + page_requested + '"]');
        if(nav_elem.html() != null) {
            nav_elem_group = nav_elem.parents().eq(2).children().first().find('a');
            if(!nav_elem_group.hasClass('on')) {
                if(!nav_elem.parents().eq(2).children().first().next().hasClass('in')) { nav_elem_group.click(); }
                $('.sidenav .on').removeClass('on');
                nav_elem.addClass('on');
                nav_elem_group.addClass('on');
            }
        }
    }
    current_ajax_request = $.ajax({
        type: 'GET',
        url: href,
        dataType: 'html',
        cache: true,
        beforeSend: function() {
        },
        success: function(data){
            $('#map-canvas').remove();
            $('.content_wrapper script').each(function(){
                $(this).remove();
            });
            $('#gbox_Customers').remove();
            if ($.browser.msie  && parseInt($.browser.version, 10) === 7) {
                $('.content_wrapper').hide().html(data).show();
                $('#content_overlay').hide();
            } else {
                $('.content_wrapper').fadeOut().html(data).hide().fadeIn();
                $('#content_overlay').fadeOut();
            }
            $('.queue_loading').hide();
            console.log('success ended');
        },
        error: function(xhr,status,error) {
            /*
             * The below console logs do not fire when the problem is occuring.
             */
            console.log('ERROR');
            console.log('xhr: ' + xhr);
            console.log('status: ' + status);
            console.log('error: ' + error);

            $('#map-canvas').remove();
            $.get('inc.404.php', function(data) {
                if($.browser.msie  && parseInt($.browser.version, 10) === 7) {
                    $('.content_wrapper').hide().html(data).show();
                } else {
                    $('.content_wrapper').fadeOut().html(data).hide().fadeIn();
                }
            });
            if ($.browser.msie  && parseInt($.browser.version, 10) === 7) {
                $('#content_overlay').hide();
            } else {
                $('#content_overlay').fadeOut();
            }
            $('.queue_loading').hide();
        },
        complete: function(data) {
            console.log(data);
            ajax_loading = false;
            set_tooltips();
        }
    });
    if(changeHash != false) {
        window.location.hash = "!" + href;
    }
}

编辑2:

通过该函数放入几个控制台日志后,查看它在哪个点断开。问题决定消失。为什么将控制台日志添加到该函数会阻止此问题发生?

我正在等待一个小时左右的时间,在没有控制台日志的情况下重新测试它,以确保它不是红鲱鱼。

编辑3:

在AJAX请求的错误回调中输入控制台日志后,似乎错误回调未触发。不太确定现在在哪里看 - 好像它是成功的,它肯定会返回内容。

1 个答案:

答案 0 :(得分:1)

不确定导致问题的原因。但是,如果这有帮助,这里是我遇到的ajax和CI会话问题的解决方案。

Ajax请求偶尔会失败,因为用户在发出ajax请求时会被注销。 (不确定为什么)

要解决此问题,请避免对ajax请求进行会话更新。为此,请创建一个覆盖sess_update方法的自定义会话类。

application/libraries/MY_Session.php

class MY_Session extends CI_Session
{
    public function sess_update()
    {
        if (!IS_AJAX) {
            parent::sess_update();
        }
    }
}

IS_AJAXapplication/config/constants.php

中定义
define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');