HTTP Return und Scriptfortführung

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

  • HTTP Return und Scriptfortführung

    Moin zusammen!

    Folgende Ausgangssituation:

    Eine beliebige HTML datei greift zur parameterübergabe auf ein PHP Script zu.
    Das Script wertet die Parameter aus, schreibt eventuell ein paar einträge in 'ne Datenbank und fertig.

    Problematik:
    Da HTTP Socketmässig blockt wartet der Browser mit dem weiterladen bis das Script durchgenudelt ist.
    Das muss aber eigentlich nicht sein, da ja lediglich parameter übergeben werden sollen.

    Frage:
    Gibt es eine Möglichkeit vom Script aus dem Brwoser mitzuteilen, dass er weiterladen kann während das Script selbst weiterhin durchläuft und seine Auswertungen fährt?

    Schon mal danke im Voraus....

    GreeZ

  • #2
    Du könntest output buffering verwenden. Aber damit kann auch nur geladen werden was VOR dem Script liegt, weil alles von oben nach unten durchläuft.
    Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
    var_dump(), print_r(), debug_backtrace und echo.
    Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
    Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
    Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

    Kommentar


    • #3
      Eventuell kannst du da was flush() machen. Die Ausgabe wird dann schon mal an den Browser gesendet, während das Script weiterläuft.
      "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

      Kommentar


      • #4
        Hallo,

        du könntest das ganze in 2 Skripte aufteilen:

        Das 1. Skript nimmt die Parameter entgegen

        Das 2. Skript nimmt deinen DB eintrag oder sonst was vor.

        Das 2. Skript rufst du im 1. Skript per exec() auf, da gibts irgendnen Parameter dazu, dass das ganze in nem eigenen Prozess gestartet wird. Dann läuft das 1. Skript praktisch ohne Verzögerung bis zum Ende durch.
        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
        Schön - etwas Geschichte kann ja nicht schaden.
        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

        Kommentar


        • #5
          exec() wär an sich 'ne idee...

          aber wenn ich von script1 exec(script2, args[]) aufrufe, dann wartet script1 ja trotzdem auf die Rückkehr der Funktion...

          damit hab ich ja auch nix gewonnen

          Kommentar


          • #6
            Eben nicht, wenn man's richtig macht.

            Das 2. Skript rufst du im 1. Skript per exec() auf, da gibts irgendnen Parameter dazu, dass das ganze in nem eigenen Prozess gestartet wird. Dann läuft das 1. Skript praktisch ohne Verzögerung bis zum Ende durch
            Schau mal hier!

            Ich hatte ein ähnliches Problem.
            Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
            Schön - etwas Geschichte kann ja nicht schaden.
            Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

            Kommentar


            • #7
              Das klingt schonmal recht gut, damit könnte ich also dieses problem eliminieren.

              aber:
              auf das script, dass dann per exec() ein weiteres aufruft, welches in einem eigenen prozess gestartet wird, wird sehr viele Zugriffe erhalten.
              Das aktuelle Script läuft bei hohem traffic bis zu 10 sek.

              ergo: es wird sehr viele Prozesse starten und dann wird mir wahrscheinlich der Server in die Knie gehen.

              Kommentar


              • #8
                Das Problem hast aber dann so oder so und hat wenig bis nichts mit der Auslagerung dieses Sripts zu tun.

                Hast nen eigenen Server oder nur Webspace? Wenn du viel Traffic hast und damit viel Arbeit für den Server verbunden ist wirst über kurz oder lang an so Sachen wie Load-Balancing denken müssen.
                Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                Schön - etwas Geschichte kann ja nicht schaden.
                Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                Kommentar


                • #9
                  das problem an sich hab ich sowieso, stimmt.
                  Allerdings, das erzeugen eines neuen Prozesses erzeugt, imho, auch etwas mehr overhead als die Verwendung von PHP als Apache Modul.

                  Load Balancing ist auch in Planung, weil ablaufdauer einfach unter aller sau ist...
                  Mal davon agbesehen, dass sich aus dem code auch noch die ein oder andere msec rausoptimieren lässt.

                  Kommentar


                  • #10
                    Ein Browser erkennt, dass das Laden beendet ist, wenn die Content-Length wie im Header angegeben erreicht ist oder ein EOF kommt oder die Verbindung beendet wird. Oder? (großes, ernstzunehmendes Oder, denn ich rate nur)

                    Kommentar


                    • #11
                      ja, aber das war ja nicht das eigentliche Problem.
                      Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                      Schön - etwas Geschichte kann ja nicht schaden.
                      Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                      Kommentar


                      • #12
                        Also, erstmal danke an Quetschi

                        leider wartet bei mir script 1 auf die Rückkehr von exec(), selbst wenn ich die Ausgabe umleite...

                        zum testen hab ich leider nur ein Win System, und ich gehe mal davon aus, dass sich eine windows shell nicht in den Hintergrund schieben lässt.

                        Oder ich hab den stream falsch umgeleitet...

                        Kommentar


                        • #13
                          .. eine windows shell lässt sich in den hintergrund schieben, mach ich doch schließlich momentan auch so ..

                          exec('dein_befehl_zum_ausführen > gewünschte_umleitung');

                          /dev/null gibts ja leider nicht, also such dir irgend eine temporäre datei

                          PHP-Code:
                          do $file $_ENV['TEMP'] . '\\' sha1(microtime(true)) . '_phpTmp';
                          while (
                          file_exists($file)); 
                          irgendwie so in der art - das while sollte eigentlich gar ned greifen, da es zu keinem konflikt kommen sollte, habs trotzdem mal eingebaut, ist ja nur eine zeile + do
                          mfg,
                          [color=#0080c0]Coragon[/color]

                          Kommentar


                          • #14
                            hmm... das file_exists() is tatsächlich net nötig, da die datei, falls nicht vorhanden, angelegt wird.

                            momentan leite ich in 'ne logdatei um, also nicht mehr in STDOUT.

                            Trotzdem wartet das exec() aufrufende script.

                            mal mit code:

                            PHP-Code:
                            $f $_ENV['TEMP']."/".sha1(microtime(true))."._tmp";
                            exec("PHP {$_SERVER['DOCUMENT_ROOT']}exectest/sqlexec.php \"{$args[1]}\" \"{$args[3]}\"  > $f"); 

                            Kommentar


                            • #15
                              Weiß jetzt ned wie das unter Windows geht, aber musst du PHP nicht mit PHP.exe aufrufen?

                              @Coragon
                              PHP-Code:
                              exec("php4 ".$DOCUMENT_ROOT."/pfadzum/skript.php > /dev/null 2>&1 & echo $!"); 
                              > /dev/null : leitet an den 'Papierkorb' um, soweit sogut

                              aber was ist das noch?

                              > 2>&1 & echo $!

                              Muss gestehen, dass ich das damals einfach von irgendwo übernommen hab und es hat funktioniert. Aber würd schon ganz gerne wissen was ich da überhaupt angestellt hat
                              Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                              Schön - etwas Geschichte kann ja nicht schaden.
                              Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                              Kommentar

                              Lädt...
                              X