mehrere Script-Instanzen von einem Client(-programm) parallel ablaufen lassen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mehrere Script-Instanzen von einem Client(-programm) parallel ablaufen lassen

    Bekanntlich läuft normalerweise jedes php-Script pro Aufruf in der Serverumgebung (bei mir im Apache2) als eine Art eigenständige Instanz des betreffenden php-Scripts, ich bezeichne im folgenden also mal einen eigenständigen Scriptdurchlauf als Script-Instanz.

    Verschiedene Script-Instanzen eines Scripts können normalerweise zeitlich parallel ablaufen.
    Kommen allerdings die Scriptaufrufe vom gleichen Client (z.B. gleiche IP und gleiches Clientprogramm), funktioniert der parallele Aufruf bei mir nicht mehr, wie erwartet oder zumindest von mir erhofft.

    Beide Script-Instanzen werden zeitlich nacheinander abgearbeitet.

    test.php:
    PHP-Code:
    <?php
    set_time_limit
    (180); 
    ob_implicit_flush() ;

    for(
    $i =0$i<=40$i++){
        echo 
    "$i <br/>\n";
        
    sleep(1);
    }
    ?>
    Rufe ich das Script z.B. in zwei verschiedenen Tabs des gleichen Browsers nahezu zeitgleich auf, wartet der zweite Script-Aufruf, bis der erste Durchlauf beendet ist.
    (getestet mit jeweils 2 Tabs in Mozilla und Opera auf
    Server:
    Apache/2.2.4 - php PHP/5.2.1 - WinXP
    Apache ?? - php 5.2.0-8-etch Debian
    )


    Rufe ich dasselbe Script nahezu zeitgleich von zwei verschiedenen Browsern oder mit zwei verschiedenen Host-Angaben (z.B mit.: http://127.0.0.1/test.php und http://localhost/test.php) auf, starten beide Script-Instanzen sofort nach dem jeweiligen Script- Aufruf. (es wird also nicht gewartet, bis eine gerade laufende Script-Instanz beendet ist).

    Dieses Verhalten hatte ich nicht erwartet.
    Woran liegt das?

    Wie kann ich mehrere Scriptaufrufe des gleichen Scripts vom gleichen Client zeitl. parallel abarbeiten lassen.
    Zuletzt geändert von ospx; 27.12.2008, 08:57.

  • #2
    Ohne genauere Angaben zur Serverkonfiguration ist es sehr schwer, aussagen zu machen, aber ich würde mal schätzen, daß der Apache Beschränkungen für die maximale Anzahl gleichzeitiger Verbindungen pro IP auferlegt (z.B. mit dem Modul mod_throttle), oder ein Ressourcen-Limit (Rechenzeit, Speicher) pro IP festlegt (Was mir aber als eingebaute Apache-Funktion nicht bekannt ist). Oder es ist die Firewall des Servers, oder oder... PHP selbst ist ziemlich sicher unschuldig.

    Vielleicht bringt dich auch eine Google-Anfrage á la
    http://www.google.de/search?hl=de&q=...le-Suche&meta=
    weiter.

    Kommentar


    • #3
      Es scheint einfach an den Browsern zu liegen. Habe mir gerade testweise einen einfachen java-Client geschrieben. Der verhält sich so, wie ich es erwartet habe.
      Ich kann mehrere Client-Instanzen starten und diese werden vom Server auch prallel abgearbeitet.

      Ich frage mich nun bloß, wie wohl das Javascript XMLHttpRequest-Object (bzw. ActiveX) damit umgeht.
      Zuletzt geändert von ospx; 27.12.2008, 13:21.

      Kommentar


      • #4
        Ich glaube nicht, dass es am Browser liegt. Wenn ich mir meinen Firebug ansehe, dann werden die meisten Ressourcen parallel angefordert.
        Afaik verhält sich PHP bei gestarteter Session seriell, so dass die Sessiondaten nicht von zwei Prozessen gleichzeitig geändert werden können. Ist vielleicht session.auto_start aktiv?

        Kommentar


        • #5
          nein, session.auto_start steht auf beiden Servern (auf denen ich das jetzt getestet habe) auf 'off'.

          Die Serverkonfigurationen dürften eigentl. nicht besonders exotisch sein. Das eine ist eine fast-standard-Xampp - Konfiguration und das andere ist eine durchschnittl. Konfiguration eines öffentlichen Anbieters.

          Es würde mich sehr interessieren, ob das Phänomen bei euch auch auftritt. Oben gepostetes Testscript läuft langsam und zeigt durch die ungepufferte Ausgabe, was gerade passiert, sodass man bequem zwei Requests nacheinander absetzen kann und den (parallelen oder blockierenden ) Verlauf gut beobachten kann.

          Ich glaube eher, es fällt meist einfach nicht auf, da php-Scripte selten lange Laufzeiten haben, wie das oben gepostete, und wenn, kaum dasselbe Script zweimal direkt nacheinander aufgerufen wird.

          Edit: Nicht, dass wir uns falsch verstehen. Es geht um ein und dasselbe php-Script (ident. URL), welches direkt zweimal hintereinander aufgerufen werden soll und dadurch zwei parallel laufende php-Script-Instanzen erzeugt und abgearbeitet werden sollen. Hatte ja oben geschrieben, dass es ausreicht, in der URL zwei verschiedene Host-Angaben (z.B. 127.0.0.1 und 127.0.0.2) zu schreiben, und schon läuft es parallel.
          Zuletzt geändert von ospx; 27.12.2008, 14:42.

          Kommentar


          • #6
            Ein ordentlicher Browser merkt einfach, wenn die selbe URI gerade in einem anderen Tab/Fenster geöffnet wird. Statt den Request noch einmal abzuschicken, wartet er einfach ab, bis die Seite im ersten Tab/Fenster geladen ist und lädt sie im zweiten Tabe/Fenster aus dem Cache.

            Sobald man Firebug für eine URI aktiviert, passiert das nicht mehr, denn damit Firebug die Ladezeiten usw. anzeigen kann, muss natürlich auch wirklich was übers Netz geladen werden. Kurzum: Firebug umgeht den Browsercache.

            Wenn du dieses Verhalten grundsätzlich wünschst, schaltest du einfach deinen Browsercache ab. Wenn du eine Seite betreibst und dieses Verhalten für alle deine Besucher wünschst, sendest du entsprechende Header - oder überdenkst dein Konzept noch einmal.

            Kommentar


            • #7
              Ja, hatte inzwischen auch die Header gesetzt.

              Aber bin jetzt mit den Headern und ohne Session bei einem halbwegs akzeptablen Ergebnis angekommen. Wobei es natürlich sehr blöd ist, dass keine Sessions verwendet werden können.

              Kommentar


              • #8
                Wenn es so ist, wie onemorenerd vermutet, dann mußt du halt einen zufälligen String ans Ende der URL im 2. Tab hängen.

                Kommentar


                • #9
                  Dank euch - wie gesagt, funktioniert jetzt. Besonders auf das Problem der Sessions wäre ich nicht gekommen.
                  Die Header sind ebenso nötig. Dass man keine Sessions verwenden kann, bleibt aber doof. Ich weiß, wie ich mir meine eigene Sessionverwaltung aufbaue. Das nutzt mir aber bei meinem konkreten Experiment ziemlich wenig, da es eine kleine zusammengehörige Klassensammlung (ich will es nicht library nennen) werden soll, die in anderen Scripten verwendet werden kann/soll, wenn funktioniert, was ich mir vorstelle. In den jeweils einbindenden php-Scripten könnten durchaus Sessions aufkreuzen.

                  Der Opera verhält sich so, wie onemorenerd es beschreibt, solange die header fehlen.

                  Kommentar


                  • #10
                    Hast du es mit einem zufälligen Anhängsel an die URL probiert?

                    Kommentar


                    • #11
                      Aber bin jetzt mit den Headern und ohne Session bei einem halbwegs akzeptablen Ergebnis angekommen. Wobei es natürlich sehr blöd ist, dass keine Sessions verwendet werden können.
                      Natürlich kann man auch Sessions verwenden!!
                      Aber das Session Locking spielt einem einen Streich.
                      Also die Session nur "kurz" starten. Variablen lesen und SOFORT danach session_write_close().

                      Das sollte deine Sorgen zumindest mildern.
                      Wir werden alle sterben

                      Kommentar


                      • #12
                        Ohh, vielen Dank, das klingt sehr gut.

                        Kommentar

                        Lädt...
                        X