AJAX-Anfrage in CodeIgniter-Anwendung fehlgeschlagen nach Inaktivität

Die Anwendung, an der ich arbeite, ist in CodeIgniter integriert, und der Inhalt wird immer über AJAX in den Hauptinhaltsdiv geladen.

Dies funktioniert normalerweise fehlerfrei, außer nachdem der Benutzer für kurze Zeit inaktiv war.

Wir haben die Inaktivitätszeit, die für die fehlgeschlagene Anforderung erforderlich ist, nicht vollständig eingegrenzt, aber es sind ungefähr 40 Minuten oder mehr Inaktivität.

Ich habe versucht, Details in der Konsole im Fehlerrückruf der AJAX-Anfrage zu protokollieren, aber nichts wird protokolliert.

Ich denke, dass es mit dem Ablauf einer Sitzung zusammenhängt, aber ich kann mir nicht sicher sein. Ich weiß, wenn ich CodeIgniter benutze, gibt es zwei Sitzungen, die automatisch erstellt werden (PHPSESSID und ci_session), also ist mein Instinkt, dass es etwas damit zu tun hat, oder eines von ihnen, das abläuft?

Wenn die Anfrage fehlschlägt, zeigen die Header, die Vorschau, die Antwort und die Cookies-Registerkarte in den Chrome-Entwicklertools nichts an.

Wenn jemand das vorher erfahren hat, oder irgendwelche Ideen hat, was das Problem verursachen könnte, würde ich den Input schätzen.

Bearbeiten:

Unten ist die AJAX-Anfrage, bei der das obige Problem auftritt.

Alle Links in meiner Anwendung verwenden diese loadPage-Funktion anstelle einer Standardumleitung.

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

Bearbeiten 2:

Nachdem Sie mehrere Konsolen-Logs durch die Funktion gelegt haben, sehen Sie, an welcher Stelle es bricht. Das Problem hat sich entschieden zu verschwinden. Aus welchem ​​Grund verhindert das Hinzufügen von Konsolenprotokollen zur Funktion das Auftreten dieses Problems?

Ich warte momentan eine Stunde oder so, um es ohne die Konsolenprotokolle erneut zu testen, um sicherzustellen, dass es kein Ablenkungsmanöver ist.

Bearbeiten 3:

Nachdem der Fehlerrückruf der AJAX-Anforderung in der Konsole protokolliert wurde, scheint der Fehlerrückruf nicht ausgelöst zu werden. Nicht ganz sicher, wo es jetzt aussehen soll - als ob es ein Erfolg wäre, würde es sicherlich den Inhalt zurückgeben.

0
Nun, die Anfrage lädt Seiten innerhalb der Anwendung, die die Sitzungen verwenden, auf die ich Bezug genommen habe. Habe ich Recht, wenn ich daran denke, dass eine AJAX-Anfrage die Daten nicht bei einem Session-Timeout zurückgibt, wo - wie bei einer Browseraktualisierung? Es ist nur ein Standard-jQuery AJAX-Aufruf, aber ich werde den Code veröffentlichen.
hinzugefügt der Autor Ryan, Quelle
@DamenPirsy siehe meine Bearbeitung für die fragliche Funktion zu posten.
hinzugefügt der Autor Ryan, Quelle
@ahmad Ich habe die Session-Bibliothek kürzlich geändert (unsicher, in welcher Version ich sie geändert habe), aufgrund eines Problems, bei dem die Kopfzeile für erstellte Sitzungen jedes Mal neu gesendet wurde, wenn ein neues Element zur Sitzung hinzugefügt wurde. Dies führte dazu, dass mehrere Benutzer Fehler aufgrund einer ungewöhnlich großen Header-Größe meldeten. Das Problem trat jedoch auf, bevor ich die Sitzungsbibliothek änderte. Aus diesem Grund bin ich mir nicht sicher, ob wir die Session-Bibliothek einfach in die CI3-Version ändern können, falls das Problem mit der Kopfzeilengröße e
hinzugefügt der Autor Ryan, Quelle
Wie sind Ihre Anfragen an Sitzungen gebunden? Können Sie den entsprechenden Code anzeigen?
hinzugefügt der Autor Damien Pirsy, Quelle
Ich hatte das gleiche Problem zuvor, Dies ist im Entwicklungszweig von CodeIgniter (CI 3) behoben, Sie können es von Github erhalten oder kopieren Sie einfach die Sitzungsbibliothek von dort.
hinzugefügt der Autor ahmad, Quelle
Siehe @Seain Malkin Antwort, ich denke, es ist nahe an dem, was in CI 3 geändert wurde
hinzugefügt der Autor ahmad, Quelle

1 Antworten

Ich bin mir nicht sicher, was das Problem verursacht hat. Aber nur für den Fall, dass dies hilft, hier ist eine Lösung für ein Ajax- und CI-Sitzungsproblem, das ich hatte.

Ajax-Anfragen würden gelegentlich fehlschlagen, weil der Benutzer ausgeloggt würde, wenn die Ajax-Anfrage gestellt wurde. (Nicht wirklich sicher warum)

Um das Problem zu beheben, vermeide eine Sitzungsaktualisierung bei Ajax-Anfragen. Erstellen Sie dazu eine benutzerdefinierte Sitzungsklasse, die die Methode sess_update überschreibt.

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
hinzugefügt
Woher kommt die Konstante IS_AJAX? Ich vermutete, dass dies ein CI-Preset war, aber das scheint es nicht zu sein.
hinzugefügt der Autor Ryan, Quelle
Danke - Ich habe diese Änderung nur geringfügig anders gemacht, die Funktion in der Hauptsitzungsbibliothek geändert und die Funktion in der Eingabeklasse ( is_ajax_request ) verwendet, um nach einer AJAX-Anfrage zu suchen. Muss jetzt getestet werden - hoffentlich wird das es knacken.
hinzugefügt der Autor Ryan, Quelle
So weit, ist es gut. Getestet nach 1 Std. 20 Min. Inaktivität und das Problem trat nicht auf. Werde es ein paar mehr Tests geben, bevor es als Antwort markiert.
hinzugefügt der Autor Ryan, Quelle
@Stanyer Sorry, das war ein bisschen vage. Ich habe die Antwort aktualisiert.
hinzugefügt der Autor Seain Malkin, Quelle
@Stanyer Ich nehme an, das hat dein Problem nicht behoben?
hinzugefügt der Autor Seain Malkin, Quelle
PHP - Deutsche Gemeinschaft
PHP - Deutsche Gemeinschaft
5 der Teilnehmer

In dieser Gruppe sprechen wir über PHP. Partner: de.switch-case.com

JavaScript - Deutsche Gemeinschaft
JavaScript - Deutsche Gemeinschaft
3 der Teilnehmer

In dieser Gruppe sprechen wir über JavaScript.