我正在处理的应用程序是在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请求的错误回调中输入控制台日志后,似乎错误回调未触发。不太确定现在在哪里看 - 好像它是成功的,它肯定会返回内容。
答案 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_AJAX
在application/config/constants.php
define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');