Solicitud de AJAX en la aplicación CodeIgniter que falla después de la inactividad

La aplicación en la que estoy trabajando está construida en CodeIgniter, y el contenido siempre se carga a través de ajax en el div principal de contenido.

Esto funciona normalmente, excepto después de que el usuario ha estado inactivo por un tiempo breve.

No hemos reducido por completo el tiempo de inactividad requerido para que la solicitud falle, pero es alrededor de 40 minutos o más de inactividad.

Intenté registrar los detalles en la consola en la devolución de llamada de error de la solicitud AJAX, pero no se registra nada.

Estoy pensando que está relacionado con el vencimiento de una sesión, pero no estoy seguro. Sé que cuando utilizo CodeIgniter, hay dos sesiones que se crean automáticamente (PHPSESSID y ci_session), así que mi instinto es que tiene algo que ver con esto, o una de ellas, ¿caduca?

Cuando falla la solicitud, los encabezados, la vista previa, la pestaña de respuestas y cookies en las herramientas de desarrollador de Chrome no muestran nada.

Si alguien ha experimentado esto antes, o tiene alguna idea de lo que puede estar causando el problema, agradecería la contribución.

Editar:

A continuación se encuentra la solicitud AJAX que está experimentando el problema anterior.

Todos los enlaces dentro de mi aplicación utilizan esta función loadPage en lugar de una redirección estándar.

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

Editar 2:

Después de colocar varios registros de consola a través de la función, para ver en qué punto se rompe. El problema decidió desaparecer. ¿Por qué motivo agregar registros de consola a la función evita que ocurra este problema?

Actualmente estoy esperando una hora o más para volver a probarlo sin los registros de la consola para asegurarme de que no sea una pista falsa.

Editar 3:

Después de colocar los registros de la consola en la devolución de llamada de error de la solicitud AJAX, parece que la devolución de llamada de error no se está disparando. No estoy seguro de dónde mirar ahora, como si fuera un éxito, seguramente devolvería el contenido.

0
Bueno, la solicitud está cargando páginas dentro de la aplicación que utilizan las sesiones a las que me he referido. ¿Estoy en lo cierto al pensar que una solicitud de AJAX no devolverá los datos en un tiempo de espera de la sesión, donde, como lo hará una actualización del navegador? Es solo una llamada jQuery AJAX estándar, sin embargo, publicaré el código.
agregado el autor Ryan, fuente
@DamienPirsy veo mi edición para publicar para la función en cuestión.
agregado el autor Ryan, fuente
@ahmad He cambiado la biblioteca de sesiones recientemente (no sé a qué versión la cambié) debido a un problema por el cual el encabezado de las sesiones creadas se volvía a enviar cada vez que se agregaba un nuevo elemento a la sesión. Esto resultó en varios usuarios que informaron errores debido a un tamaño de encabezado anormalmente grande. Sin embargo, el problema que estoy experimentando estaba sucediendo antes de que cambiara también la biblioteca de la sesión. Debido a esto, no estoy seguro de que podamos cambiar la biblioteca de sesiones a la versión CI3 en caso de que surja nuevamente
agregado el autor Ryan, fuente
¿Cómo se relacionan sus solicitudes con las sesiones? ¿Podrías mostrar el código relevante?
agregado el autor Damien Pirsy, fuente
He tenido el mismo problema anteriormente, esto está solucionado en la rama de desarrollo de CodeIgniter (CI 3), puede obtenerlo desde github o simplemente copiar la biblioteca de sesión desde allí.
agregado el autor ahmad, fuente
Vea la respuesta de @Seain Malkin, creo que está cerca de lo que cambió en CI 3
agregado el autor ahmad, fuente

1 Respuestas

Inseguro de lo que está causando su problema. Pero en caso de que esto ayude, aquí hay una solución para un problema de sesión de CI y ajax que tuve.

Las solicitudes de Ajax fallarían ocasionalmente porque el usuario se desconectaría cuando se realizara la solicitud de ajax. (No estoy seguro por qué)

Para solucionar el problema, evite una actualización de la sesión en las solicitudes ajax. Para hacer esto, crea una clase de sesión personalizada que anule el método 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 is defined in application/config/constants.php

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
0
agregado
¿De dónde viene la constante IS_AJAX? Supuse que era un preset de CI, pero parece que no lo es.
agregado el autor Ryan, fuente
Gracias. He introducido este cambio de forma ligeramente diferente, modifiqué la función dentro de la biblioteca de sesión principal y usé la función en la clase de entrada ( is_ajax_request ) para buscar una solicitud AJAX. Necesita ser puesto a prueba ahora - con suerte esto lo resolverá.
agregado el autor Ryan, fuente
Hasta aquí todo bien. Probado después de 1hr20 minutos de inactividad y el problema no ocurrió. Le dará algunas pruebas más antes de marcar como respuesta.
agregado el autor Ryan, fuente
@Stanyer Lo siento, fue un poco vago. Actualicé la respuesta.
agregado el autor Seain Malkin, fuente
@Stanyer Supongo que esto no solucionó tu problema?
agregado el autor Seain Malkin, fuente
PHP - Comunidad española
PHP - Comunidad española
6 de los participantes

En este grupo hablamos de PHP. Partner: es.switch-case.com

JavaScript - Comunidad española
JavaScript - Comunidad española
4 de los participantes

En este grupo hablamos de JavaScript. Partner: es.switch-case.com