• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

ajax, jquery, mehere verbindungen parallel

F

FoXMorayn

Guest
Hallo,

ich rufe starte x verbindungen mit jquery get() und warte auf deren ergebnis. ich frage daten auf anderen servern über ein eigenes php script ab.
leider bekomme ich alle ergebnisse hintereinander mit 1-2 sekunden verzögerung.

wir wär es lieber, wenn diese parallel laufen würden. so könnte die wartezeit um ein vielfaches verkürtzt werden.

im firebug werden mir nach dem start sofort alle offenen verbindungen angezeigt und danach abgearbeitet.

kann es am server liegen?

anbei die Firefox einstellungen und ein screen vom firebug log.
 

Anhänge

  • firefox.jpg
    firefox.jpg
    29,6 KB · Aufrufe: 8
  • Unbenannt.JPG
    Unbenannt.JPG
    81 KB · Aufrufe: 12
vitus37 schrieb:
Dass ein Rechner immer nur einen Request senden kann, ist so, da lässt sich nichts einstellen.

Kann sein, dass ich das falsch verstanden habe, aber wieso sollten nicht mehrere Ajax-Requests parallel ausgeführt werden können? Im Grunde ist es doch das, wozu sie da sind.

PHP:
<?php

if (isset($_GET['longrequest'])) {
    sleep(10);
    exit;
} else if (isset($_GET['shortrequest'])) {
    sleep(1);
    exit;
}

?><!DOCTYPE html>

<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>New</title>
        <script type="text/javascript"
            src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js">
        </script>

        <script type="text/javascript">

            $('document').ready(function () {
                $.get('?longrequest', function () {
                    $('body').append('<p>Long request received</p>');
                });

                for (var i = 0; i < 15; i++) {
                    (function (index) {
                        $.get('?shortrequest', function () {
                            $('body').append('<p>Short request received (#'
                                + index + ')</p>');
                        });
                    })(i);
                }
            });

        </script>

    </head>

    <body>

    </body>

</html>

Wo in dem Zusammenhang welche Limits definiert sind, weiß ich allerdings auch nicht.
 
ich habe ein script, welches etwas länger braucht, ca eine sekunde. das script wartet auf einen anderen server. nun starte ich mit jquery ca 100 requests:

Code:
for(i=0;i<=array.length-1;i++)
               {
                        $.get();
}
get ruft ein php script auf, welches die daten, die es per get bekommen hat, an einen anderen server sendet und mir das ergebnis liefert.
fasse ich mehere datensätze zusammen, arbeitet php diese auch nacheinander ab und ich komm sehr schnell auf die maximale ausführungszeit des scriptes.
optimal ist es, wenn alle diese requests nahe zu parallel laufen würden. so müssen die weiteren abfragen nicht erst auf die anderen warten.
so wie ich das sehe begrenzt mich da der client (firefox), indem er erst auf die antwort eines scriptes wartet, denn nach dem starten des jquery scripts werden sofort alle ajax requests abngezeigt.
 
Du solltest die Requests durchnummerieren und dann anzeigen lassen, in welcher Reihenfolge sie ankommen. Dann siehst du, dass diese durchaus parallel ausgeführt werden und in unterschiedlicher Reihenfolge abgearbeitet werden. Allerdings ist die Anzahl der parallelen Requests beschränkt.
 
100 Requests? Firefox unterstützt maximal vier Requests pro Domain, was neulich erhöht wurde. Ich würde dringend die Requests verringern, besonders weil diese ziemlich ähnlich sein müssen.
Ansonsten musst du den Prozess optimieren, z.B. indem die Verbindung mit Connection: keep-alive nicht sofort beendet wird, du Link: <http://foobar.com>; rel="dns-prefetch" benutzt, die Requests komprimierst (minified, gzip) und vernünftiges Caching einsetzt.
 
wie optimiere ich mit keep-alive? ich sende fehlercodes zurück. pro request bekommt ein script eine url, für die ich informationen von anderen servern hohle.
mach ich dies in einem php script wird das ganze nacheinander abgearbeitet und ich laufe gefahr an die maximale ausführungszeit zu überschreiten.
das ganze in ca. 10ner pakete zu bündeln bringt daher leider nur sehr wenig. firefox soll einfach nur alle requests rausschicken, der server sendet seine requests raus und dann kann auf die antwort gewartet werden. sollte meiner meinung nach ca nahe zu requests*100% an zeitersparnis bringen.
 
kann es am server liegen, dass ich so lange warten muss? kann er nicht 100 requests rauschicken und parallel auf die antworten warten?
es geht u.a. um die funktion gethostbyname(). möchte mich nicht damit abfinden, dass ich erst auf die antwort von host1 warten muss um danach host2 nach der ip fragen zu können. im moment brauche ich für 150 aufrufe ca 40 sekunden. 2,6 sekunden wartezeit pro aufruf. meiner logik nach, könnte ich die zeit auf die der längsten abfrage reduzieren. ist ein host nicht erreichbar, ist er das schwächste glied in de kette und die funktion braucht ca 5 sekunden, weil sie wartet. werden vorher alle anderen requests abgearbeitet, reduziert sich das ganze auf die 5 sekunden.
 
Irgendwas machst du falsch. Du musst nicht auf den Response warten, es sei denn du stellst explizit das "asynchron" aus. Aber normalerweise läuft die AJAX Kommunikation asynchron und niemand muss auf irgendjemanden warten, die einzige Begrenzung die es gibt, sind die der maximalen Request pro Server.

und um deine Frage zu beantworten, ja man kann 100 request abschicken und parallel auf die Antwort warten.
 
Eine Idee wäre vor allem eine gute Caching-Strategie (hat crash glaube ich auch schon gesagt), falls die abzufragenden Daten nicht so variabel sind, dass Cachen keinen Sinn hat, und falls sie nicht auf die Minute stimmen müssen. Vielleicht könntest du dazu dein Vorhaben etwas mehr umschreiben, dann können wir vielleicht Tipps geben.
 
möglichst schnell ip, xovi rank und pr abfragen.
habe 2 verschiedene varianten: ein cron, der mehere zehntausend seiten abfragen muss und eine live-abfrage für mehere hundert.
der cron fragt, nur die ip ab und braucht damit schon mehr als 15min.

edit: hat wer schon erfahrung mit multithreading in php?
 
Sind die Eingabeadressen (also wahrscheinlich die Domains) gleichbleibend? Dann könntest du die Rückgaben cachen. Dürfen die Ergebnisse n Minuten alt sein? Dann könntest du die Rückgaben cachen.

Wenn du die Rückgaben im Cache hast und die beschriebenen Voraussetzungen erfüllt sind, brauchst du bei der Liveabfrage lediglich die gecachten Werte auszulesen. Die sind dann zwar n Minuten alt, aber das dürfte bei Pagerank oder IP ja wohl kaum eine Rolle spielen.
 
cachen mache ich schon, aber irgendwann müssen die daten mal abefragt werden.
nutze ich bilder zum senden der daten und verzichte auf die rückgabe per ajax, spar ich 1/4 der zeit... *kopp aufn tisch hau*

zudem hab ich schon lange den verdacht, dass die max.connection einstellungen keine perfomance steigerung bringen.
verschiedene hosts pro request sollen helfen, die max connections zu umgehen. wildcard subdomain, wäre da ein ansatz.


EDIT: der übeltäter ist definitiv der server, die variante mit den bildern verrät ihn. alle requests werden gesendet. aber egal ob mit 15 oder 20 requests gleichzeit, verringert sich die gesamtzeit nicht. (bei 20gesamt requests)
kann der server nicht soviele abfragen gleichzeit verarbeiten, oder will er nicht? er sollte rein technisch doch in der lange sein 100 abfragen nahezu parallel zu starten.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben