2013-05-14 8 views
5

In meinem Projekt (PHP mit Symfony 2) Ich mache eine Menge von Ajax Anfragen auf jeder Seite. Ich habe viele Probleme mit ihnen, weil es so aussieht, als würden Browser (die in Google Chrome und Firefox getestet wurden) Anfragen abbrechen, ohne mir einen Fehler mitzuteilen. Ich habe eine saubere Seite erstellt, um zu testen, was dieses Problem verursachen kann, und der Fehler bleibt bestehen. Ich habe einen Test gemacht, der 10 Anfragen innerhalb einer for Schleife durchführt (ich glaube, dass wir kein Problem damit haben, richtig?).Browser bricht Ajax-Anfragen sporadisch ab, ohne Fehler zurückzugeben

Hier ist mein Code:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>Test page</title> 
    </head> 
    <body>Test page. 
     <script type="text/javascript" src="/js/compressed_jquery-1.8.2.min_1.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(function() { 
       for (var i = 0; i < 10; i++) { 
        $.get('/i18n/javaScript/pt.json', function(data) { 
         console.log(data); 
        }); 
       } 
      }); 
     </script> 
    </body> 
</html> 

Und hier ist ein Screenshot von Anfragen in Firebug führen:

Ajax requests screenshot

Wie Sie sehen können, sind einige Anforderungen abgeschlossen und andere nicht. Manchmal vervollständigt der Browser alle 10 Anfragen ohne Fehler. Was kann das verursachen?


Ich habe alle Lösungen getestet, aber ich bin mir ziemlich sicher, dass es ein Windows-, Apache- oder PHP-Konfigurationsproblem ist. Heute habe ich eine VM in meinem Rechner mit VirtualBox läuft Ubuntu 13.04 (Raring Ringtail) mit Apache 2.2 + PHP, und keine Fehler konfiguriert, was beweist, dass nichts mit meinem JavaScript, HTML oder PHP-Code ist. Ich bin mir nicht sicher, dass es sich um ein Konfigurationsproblem handelt. Wie finde ich diese Konfiguration?

+1

Sieht aus Wie alle Anfragen sind auf die gleiche URL: Wird also jede Anfrage abgebrochen, weil sie vom Cache erfüllt wurde oder weil ein Fehler aufgetreten ist? Ändern sich die Dinge, wenn Sie einen zufälligen Querystring-Wert hinzufügen, d. H. Um den Cache zu zerstören? – thefrontender

+0

Ich glaube nicht, dass es sich um ein Abfrageproblem handelt, denn wenn der Cache verwendet wird, erhält der Browser eine Antwort 302 (nicht geändert). Und in meinem echten Code haben alle Anfragen unterschiedliche URLs. –

+0

Ich habe mein Beispiel mit dieser URL versucht: '/i18n/javaScript/pt.json?t=' + Math.floor (Math.random() * 101) und der Fehler bleibt bestehen. Es ist kein Cache-Problem. =/ –

Antwort

4

Könnte Ihre Bedürfnisse anzupassen, Anfrage Senden einer nach dem anderen sollte Server vermeiden, einige parallele Anfragen zurückgewiesen:

TEST IT

$(document).ready(function() { 
    var tot = 30; //to simulate 30 requests 
    (function request(i){ 
     if(i === tot) return; 
     $.get('/echo/html/?'+i, function (data) { 
      console.log("success"); 
     }).always(function() { request(++i) }); 
    })(0); 
}); 
+1

THank you @ geröstet, aber wie gesagt, es funktioniert nicht, weil es nicht dieselbe Anfrage ist, die gestellt wird. Es ist eine Menge verschiedener Anfragen, die von verschiedenen Quellen kommen (man weiß nicht über andere). Ich habe diese Logik nur als benutzt ein Test, aber wie auch immer, kann es nicht sein, weil das Ausführen des Codes die parallele Anforderung in meinem Server occrus mit Erfolg ausführt! =/ –

+0

Der Server kann nicht mehr als eine festgelegte Anzahl von Anfragen von einem einzelnen Client gleichzeitig verarbeiten Verhindern Sie, dass Ihr Server von einem einzigen Client abgesprungen wird.Es spielt keine Rolle, dass es sich bei allen um unterschiedliche Anfragen handelt, wenn sie sich alle auf demselben Host befinden.Nach der HTTP-Spezifikation ist die maximale Anzahl von 2 gleichzeitig.Einige Server und Browser geben Ihnen etwas mehr als das. – Centijo

+0

Es gibt einen Hack, bei dem Sie Subdomains ausschließen und auf die Stammdomäne verweisen können. Die meisten Browser geben Ihnen dann zwei Verbindungen pro Subdomain plus zwei für die Stammdomäne. – Beachhouse

2

Ich denke, Ihre Server zu lange dauert zu reagieren und der Browser ist eine Zeitüberschreitung . Es kann sein, dass der Browser nur zwei offene Verbindungen zum Server hat und die letzten 8/10 abbricht, wenn die ersten beiden zu lange dauern. Ich würde Ihre Serverprotokolle überprüfen, um dies zu bestätigen.

Was macht der Server, wenn er eine Anfrage an /i18n/javaScript/pt.json sieht? Vier Sekunden sind eine lange Zeit. Versuchen Sie, statischen Inhalt wie ein Bild oder eine statische HTML statt pt.json holen und sehen, ob das das Problem behebt.

Wenn Sie eine Menge Berechnungen durchführen müssen, um pt.json zu produzieren, kann es im Cache gespeichert werden? Ist es sehr groß? Verwenden Sie Apache?

+0

es ist keine komplexe Anfrage. Es ist ein JSON vom Server, der nur 2kb enthält. Aber nehmen wir an, es kann sein, weil es meine DEV-Umgebung ist und eine Menge Debug-Meldungen aktiviert sind. Wie kann ich dafür sorgen, dass der Browser bei diesen Anfragen nicht abläuft? Ich benutze Apache mit Wamp 2.2 –

+1

Bevor Sie versuchen, es zu beheben, Schritt eins ist zu bestätigen, was ich sage, ist wahr. Hast du versucht, einige statische Dateien zu laden? –

0

Wenn dies ein Cache-Problem ist, dann können Sie dies versuchen:

Fügen Sie den folgenden Code in der Kopfzeile Ihrer Seite. Dadurch wird verhindert, dass der Browser Daten zwischenspeichert.

<meta http-equiv="cache-control" content="max-age=0" /> 
<meta http-equiv="cache-control" content="no-cache" /> 
<meta http-equiv="expires" content="0" /> 
<meta http-equiv="expires" content="Tue, 01 Jan 1990 12:00:00 GMT" /> 

Dieses Caching in den meisten Browsern deaktivieren, und Ihre Daten werden auf jeder Aktualisierung abgerufen werden, da es keinen Cache, was

One mehr. Ihre Daten werden in einer Schleife aufgerufen ... Ich kann sagen, dass es sich um einen fortlaufenden Anruf mit derselben Anfrage handelt, so dass die Anfrage als eine doppelte Anfrage betrachtet werden kann und möglicherweise vom Dienst storniert wird; Dies könnte als eine Flut von Anfragen angesehen werden, wenn die gleiche Anfrage immer wieder gesendet wird ...

Versuchen das Hinzufügen etwas beim Telefonieren, wie dies ..

for (var i = 0; i < 10; i++) { 
    $.get('/i18n/javaScript/pt.json?v='+i, function(data) { 
     console.log(data); 
    }); 
} 

Und die Anforderung mit etwas umgehen. Versuchen Sie es zu sehen, ob es funktioniert ..

Wenn Sie open() aufrufen, indem Sie, wie Sie verwenden, jQuery, es ist eingebaut, und es wird eine Wirkung haben.

Beziehen Sie einen Stapelüberlauf Alte Post How to solve Firebug’s “Aborted” messages upon Ajax requests?.

Ich bin sicher, dass dies Sie positive Leitung in Richtung Lösung geben ...

2

Sie Anfragen mit einem globalen Objekt serialisiert werden kann:

function AjaxRequester() { 
    this.queue = []; 
} 

AjaxRequester.prototype.doRequest(request){ 
    if (this.queue.length>0){ 
     this.queue.push(request) 
    } 
    else 
     handleRequest(request) 
} 

AjaxRequester.prototype.handleRequest(request){ 
    /* actually handle ajax request, on complete inspect 
     queue and if not empty recall this method on the first 
     element */ 
} 

requester = new AjaxRequester(); 

in Ihren Code, tun

requester.doRequest(yourRequest); 
Verwandte Themen