2012-04-10 7 views
6


Ich habe eine PHP-Anwendung, die eine Menge von Ajax-Anrufe erhält.
Ich habe festgestellt, dass wenn zwei oder mehr Aufrufe gleichzeitig stattfinden, sie nicht gleichzeitig ausgeführt werden, muss die erste gestoppt werden, damit die zweite ausgeführt wird.
Ich habe einen kleinen Test erstellt, um dieses Problem zu beheben. Ich habe eine html wie folgt aus:Gleichzeitige Verbindungen mit Apache aus dem gleichen Client

<html> 
<head> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
</head> 
<body> 
    <a href="test.php">Test</a> 
    <button>Click</button> 
    <button>Click</button> 
    <button>Click</button> 
    <button>Click</button> 
    <script type="text/javascript"> 
     $('button').click(function() { 
      $.get("test.php"); 
     }); 
    </script> 
</body> 
</html> 

Die test.php enthält.

<?php 
sleep(2); 
echo 'Test'; 
?> 

So, nach $ ('Button') klicken() auf Entwickler-Tools (oder Firebug) trösten die Ausführung Anfragen kommen zur gleichen Zeit, aber geben die Antworten 2 Sekunden nach dem letzten zurück, anstatt alle vier zur selben Zeit (2 Sekunden später) zurückzukehren.
Nun, ich habe versucht, in anderen Browsern zu öffnen, zur gleichen Zeit, diese Datei und es hat funktioniert, es wurde gleichzeitig ausgeführt. Ich meine, läuft dies auf Chrom und in Firefox Öffnen der Seite in einem Tab zeigen die "Test" in 2 Sekunden, während die Antworten von Chrome Ajax Anfragen kommen 2 Sekunden nach der letzten Anfrage beendet, so dass andere Browser-Anfrage hat keine Auswirkungen auf die erste ein Anruf (das würde zeigen, dass dies ein Sitzungsproblem ist, aber siehe unten).
Das gleiche passiert, wenn ich mehrere Registerkarten für test.php öffne.

Ich habe versucht, Sitzung zu Memcache zu ändern - Leute sagten, in anderen Fragen, dass die Sitzung sperren könnte. Es macht sehr viel Sinn, aber selbst nach dem Wechsel von Dateien zu Memcache bleibt das Problem bestehen (und das Skript hat keine Sitzung, und Session_autostart ist aus)
Ich bin wirklich etwas über ein Konfigurationsproblem mit Apache, seit dem ersten Mal Nach einer Weile, wenn ich das Skript ausführe, wird es alle 4 Ajax-Aufrufe gleichzeitig ausführen! Ich denke über einen DoS-Schutz oder so etwas nach.

Wie auch immer, jede Hilfe wäre sehr willkommen!


Ok, löste das Problem.

Es war ein Session-Locking-Problem schließlich, Problem ist, dass Memcached die Sitzung auch sperrt!
Musste php_memcached 2.0.1 installieren, das ein Sperr-Flag in memcached.ini hat und diese Version verwendet. Problem gelöst.

Obwohl wenn eine Anfrage für die gleiche URL ist (im obigen Beispiel habe ich test.php viermal benutzt), wird immer noch eins nach dem anderen ausgeführt. Ich bin mir ziemlich sicher, dass das das richtige Verhalten ist, da es nicht viel Sinn macht, mehrmals um eine Ressource zu bitten. Änderte mein Beispiel, um nach test1.php, test2.php und so weiter zu fragen und es funktionierte gut. Funktioniert auch, wenn der Querystring geändert wird.

Danke für Ihre Hilfe!

PS: Nicht Ruf habe meine eigene Frage so früh, so ist hier die Antwort

+2

versuchen, eine zufällige Zahl als Abfragezeichenfolge an Ihre Anfrage anzuhängen, um sicherzustellen, dass es sich nicht um ein Caching-Problem handelt, wie '$ .get (" test.php? "+ Date.now());' – lunixbochs

+0

Sie möchten alle Anfragen gleichzeitig? Oder willst du das vermeiden? – kuba

+0

Ich möchte alle gleichzeitig machen. Ich habe festgestellt, dass es falsch ist, dieselbe URL zu testen. Ich habe dann test1.php test4.php getestet. Problem blieb bestehen, aber ich fand, was es verursacht hat, werde ich mit der Lösung antworten. – filaruina

Antwort

-2

HTTP-Anfragen sind unabhängig voneinander zu beantworten - per Definition das HTTP-Protokoll ist staatenlos. Jede $.get(), die Sie durchführen, ist eine völlig separate und neue HTTP-Anfragen, so dass Sie am Ende mit 4 HTTP-Anfragen, 4 separate sleep() Anrufe und 4 separate Ausgänge vom Server.

+0

Ihre Antwort könnte nicht off-Thema sein. – frostymarvelous

6

in meinem Fall die Funktion:

session_write_close();

mein Problem gelöst

ich das nächste Programm haben, eine Haupt-Seite, die wiederkehrend eine Ajax-Datei ajax.php genannt nennen. Es wird alle "n" Sekunden aufgerufen.

Und meine Form hat eine Schaltfläche, die einen Bericht zurückgibt, dass es über Ajax (** reporte.php **) aufgerufen wird. Es wird nur auf Anfrage des Benutzers aufgerufen (klick) und es könnte eine Minute dauern, das zu generieren Ergebnis.

Meistens dauert ajax.php 20ms, aber wenn report.php läuft, wird die ajax.php eingefroren, bis report.php die Aufgabe beendet. Und schlimmstenfalls könnte Ajax.php gestapelt werden.

reporte.php (vor)

<?php 
// Some PHP Code goes here. 
// The rest of the PHP code (mostly, the slow part of the process). 
?> 

reporte.php (nach dem Update)

<?php 
// Some PHP Code goes here. (ideal if it is the fast part). 
session_write_close(); // fix for concurrent ajax 
// The rest of the PHP code (mostly, the slow part of the process). 
?> 

Vor der Lösung (ein Screenshot von Firebug Plugins Firefox): before

Nach der Lösung after

Überprüfen Sie, wie vor der Lösung, report.php und ajax.php beide noch geladen werden (und Ajax wurde in mehreren Aufrufen gestapelt). Und nach der Lösung wird reporte.php geladen, während alle aufeinanderfolgenden Ajax-Aufrufe bereits geladen sind.

Beachten Sie, dass nach der Funktion session_write_close() es nicht möglich (oder empfohlen) ist, eine Sitzungsfunktion und einen Wert zu verwenden.

+0

Mein Problem wurde gelöst. Auffällig weniger intensive Anfrage kam eine Sekunde später zurück. Profiliert, getestet, Server-Code war in Ordnung. Dann bemerkte es, dass es gleichzeitige Anfragen waren. Sitzung geschlossen repariert es – frostymarvelous

Verwandte Themen