Axel: Lokaler Apache/PHP - Mehrere Verbindungen

Hallo Forum,

ich habe ein Problem mit meiner lokalen Entwicklungsumgebung. Ich habe einen Apache 2 mit PHP 5.2 mit der ich eine PHP-Anwendung entwickel.
Das System scheint bei mir immer nur eine Verbindung gleichzeitig zuzulassen.
Z.B. habe ich einen etwas länger laufenden PHP-Prozess. Während dieser läuft, mache ich einige Anfragen mittels Ajax an den Server. Die Antwort der Ajax-Anfrage kommt allerdings erst, wenn der 1. Prozess abgeschlossen ist. Gleiches gilt auch, wenn ich in einem neuen Browser-Fenster eine weitere Seite von localhost aufrufe. Antwort kommt erst, wenn der Prozess fertig ist.

In der http.conf habe ich
KeepAlive On
MaxKeepAliveRequests 100

Woran könnte das liegen?

Vielen Dank im Voraus
Schöne Grüße
Axel

  1. Hallo,

    Das System scheint bei mir immer nur eine Verbindung gleichzeitig zuzulassen.

    Ja, und was für ein Operating-System ist denn das?

    Viele Grüße,
    Hotte

    1. Hallo,

      Ja, und was für ein Operating-System ist denn das?

      sorry, habe ich vergessen zu schreiben. Das OS ist Win XP Prof. SP2

      Hmm. hoffe, es ist dort nicht unmöglich !?

      Schöne Grüße
      Axel

  2. Hi Axel,

    was steht denn in deiner conf unter ThreadsPerChild (vgl.Customizing Apache for Windows)?

    Gruß
    Antipitch

    1. Hallo Antipitch,

      was steht denn in deiner conf unter ThreadsPerChild (vgl.Customizing Apache for Windows)?

      ah, vielen Dank. Das war der richtige Hinweis. ThreadsPerChild stand zwar auf 250, aber direkt darunter stand "MaxRequestsPerChild 0". Jetzt habe ich diesen Wert hoch gesetzt und es klappt.

      Vielen Dank
      Schöne Grüße
      Axel

      1. Moin!

        was steht denn in deiner conf unter ThreadsPerChild (vgl.Customizing Apache for Windows)?

        ah, vielen Dank. Das war der richtige Hinweis. ThreadsPerChild stand zwar auf 250, aber direkt darunter stand "MaxRequestsPerChild 0". Jetzt habe ich diesen Wert hoch gesetzt und es klappt.

        Damit hast du ihn runtergesetzt. Null steht für "unendlich".

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Hallo Sven,

          Damit hast du ihn runtergesetzt. Null steht für "unendlich".

          hatte ich auch gedacht, aber es schien eine Änderung zu bringen. Allerdings klappt es nicht immer. Ich denke das Problem ist, dass der erste Prozess (ein Importprozess) für ca. 1 Minute 100% CPU Last erzeugt. Daher kommen die anderen Anfragen wahrscheinlich nicht durch.
          So kriege ich natürlich keinen Progressbar hin, der mir den Status des Imports auf der Seite anzeigt. Der Uploadprogressbar funktioniert noch. Danach startet der für den Arbeitsfortschritt. Der bleibt aber bis zum Schluß auf 0% und springt dann auf 100%.

          Hat da noch jemand eine Idee, wie man das umgehen könnte? Oder ist vielleicht zu erwarten, dass das später auf dem Linuserver besser läuft... ggf. wegen besserer Performanceverteilung?

          Achso. Wenn ich von einem anderen Rechner im Netz eine Seite aufrufe, während der Prozess läuft, kriege ich eine (langsame) Antwort. Sieht fast aus, als würde die CPU-Last pro Session begrenzt..

          Vielen Dnak nochmal
          Schöne Grüße
          Axel

          1. Moin!

            Damit hast du ihn runtergesetzt. Null steht für "unendlich".
            hatte ich auch gedacht, aber es schien eine Änderung zu bringen. Allerdings klappt es nicht immer. Ich denke das Problem ist, dass der erste Prozess (ein Importprozess) für ca. 1 Minute 100% CPU Last erzeugt. Daher kommen die anderen Anfragen wahrscheinlich nicht durch.

            Nein, das ist nicht das Problem.

            Dein Browser ist das Problem. Er erlaubt pro Server nur zwei persistente Connections. Es ist also vollkommen egal, was du serverseitig konfigurierst, du kriegst de facto nur eine serielle Kommunikation hin: Entweder lädst du die Seite, oder du lädst einen einzelnen AJAX-Request. Beides gleichzeitig funktioniert nicht - jedenfalls nicht ohne einen umkonfigurierten Browser.

            Hat da noch jemand eine Idee, wie man das umgehen könnte? Oder ist vielleicht zu erwarten, dass das später auf dem Linuserver besser läuft... ggf. wegen besserer Performanceverteilung?

            Der Server ist komplett uninteressant.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Moin!

              Dein Browser ist das Problem. Er erlaubt pro Server nur zwei persistente Connections.

              Hm, das muß nochmal etwas theoretischer und ausführlicher beschrieben werden:

              Der HTTP-Standard 1.1 definiert persistente Connections. Damit ist dem Browser erlaubt, eine TCP/IP-Connection für mehr als einen Request zu benutzen, und er spart damit die Zeit ein, die sonst für den beständigen Neuaufbau von TCP-Connections draufgehen würde. Nachdem also die eigentliche Seite und eingebundene Ressourcen geladen sind, wird so eine Verbindung noch eine gewisse Zeit offen gehalten, falls noch Dinge nachzuladen sind.

              Damit der Server nun aber nicht tausende ungenutzte offene Verbindungen verwalten muß, ist im HTTP-Standard definiert, dass ein Browser nur zwei solcher Verbindungen zu einem einzelnen Server (definiert über den Hostnamen) aufbauen _soll_. Es wird also nicht durch einen Mechanismus erzwungen, man kann sich drüber hinwegsetzen, aber die Browser haben standardmäßig diese Begrenzung eingebaut.

              Außerdem erlaubt der HTTP-Standard 1.1 auch noch Pipelining. Das bedeutet, dass der Browser mehrere Requests über die Verbindung absetzt, ohne zwischendurch immer auf die Antwort warten zu müssen. Pipelining wird aber wohl vom IIS (mindestens von einigen älteren Versionen) nicht korrekt unterstützt, so dass dieses Feature im IE gar nicht implementiert ist, im Firefox ist es deaktiviert, nur in Opera wird es, verbunden mit clientseitigem Serversniffing, aktiv eingesetzt.

              Parallel zu dieser neueren HTTP-Version besteht aber auch schon in HTTP 1.0 eine erwünschte Grenze von Connections pro Server. Die liegt bei 8 Verbindungen, kann aber ebenfalls konfiguriert werden.

              Unter dem Strich bedeutet das, dass man gerade bei AJAX-Applikationen enorm geizig sein muß mit der Anzahl paralleler Requests. Man muß (worst case) davon ausgehen, dass, Asynchronität hin oder her, tatsächlich nur ein Request nach dem anderen abgearbeitet wird.

              Auf einschlägigen Seiten werden ein paar Tricks vorgeschlagen, um diese Begrenzung zu umgehen. Die universellste davon ist, Requests über mehrere Domains, die effektiv aber zum gleichen Server führen, zu verteilen.

              Das ist allerdings mit AJAX doch nicht wirklich nutzbar, da die Same Origin Policy genau sowas verhindert. Einzig statische Ressourcen wie Bilder, CSS- oder Javascript-Dateien profitieren davon.

              Der zweite Weg ist, die Zahl der Requests kleinzuhalten. Je weniger Requests, desto weniger Protokoll-Overhead und Wartezeit. Alle Javascripte, alle CSS', alle Bilder sollten, wann immer es machbar ist, in möglichst einem Stück vom Server geladen werden.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
              1. Hallo Sven,

                wow, vielen Dank für die ausführliche Antwort. Ich bin ja schon recht lange Webentwickler, aber das habe ich so gar nicht gewusst. Naja, habe auch sonst noch nie parallele Zugriffe benötigt.

                Demnach könnte es für mich ja eine Möglichkeit sein, wenn auch nicht die schönste, dass ich nach dem Starten des Importprozess durch den Benutzer, diesen über einen Konsolenaufruf extern starte und den Request damit sofort beende. Danach kann ich weitere Ajax-Requests absetzen, um den Status der Verarbeitung zu erfragen!?

                Hmm, aber wieso funktioniert das Ganze dann beim Upload? Ich meine, während des Uploads ist der Post-Request ja auch noch aktiv, trotzdem werden mir die Meldungen über den Uploadstatus per Ajax zurückgeliefert. Wieso klappt es da und sonst nicht?

                Nochmals vielen, vielen Dank
                Schöne Grüße
                Axel

  3. Hello Axel,

    hier noch ein bisschen Medizin zum draufschütten auf den IE, solltest Du den verwenden

    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
    "MaxConnectionsPer1_0Server"=dword:0000000F
    "MaxConnectionsPerServer"=dword:0000000F
    "ProxyHttp1.1"=dword:00000001

    Hab ich zufällig gefunden bei
    http://www.nico-fueller.de/computer/regs.html

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)