Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Browserausgabe abschließen vor dem Ende des PHP-Scriptes

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Browserausgabe abschließen vor dem Ende des PHP-Scriptes

    Hallo,
    gibt es eine Möglichkeit das Warten des Browsers auf das Ende des PHP-Scriptes zu verkürzen?
    Mein erster Versuch:
    PHP-Code:
    <?php
    header
    ('Content-Type: text/html; charset=UTF-8');
    ob_start();
    error_reporting(-1);
    echo 
    "Ein Test<br>";
    $out ob_get_contents();
    $lout strlen($out);
    header("Content-Length: ".$lout);
    ob_flush();
    //Simulation eines zeitaufwendigen Scriptteiles
    usleep(5000000);
    ?>
    Funktioniert nicht, d.h. im Klartext der Browser bringt 5 Sekunden lang "Warten auf .." bevor Fertig kommt.

  • #2
    warum legst du dein Script erst schlafen, vor Ende ? ...

    der Browser wartet halt explizit darauf, dass der Webserver die Seite vollständig sendet - und der tut das erst, nachdem der PHP-Interpreter sich beendet hat...
    daran ändert auch dein ob_flush nix, denn es zwingt zwar dazu, den angesammelten Ausgabepuffer zum Browser zu senden, aber sendet eben nicht das "Seite fertig"-Signal
    "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

    Kommentar


    • #3
      [man]flush[/man]
      [man]ob_implicit_flush[/man]
      [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
      [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

      Kommentar


      • #4
        Irgendwie liegt hier der seichte Geruch von Denkfehler in der Luft.

        Du willst nicht auf ein Ende des Scripts warten sondern ein Script vorher beenden: exit(); oder die();

        Ist nicht gleich:

        Du willst nicht mit der Ausgabe des Scripts auf das Ende des Scripts warten, sondern vorher klötzchenweise senden: ob_implicit_flush() / ob_start(), ob_flush(); ob_end_flush()
        [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

        Kommentar


        • #5
          Ein flush() hat gefehlt, jetz funzt es, danke fab
          Zitat von eagle275 Beitrag anzeigen
          der Browser wartet halt explizit darauf, dass der Webserver die Seite vollständig sendet - und der tut das erst, nachdem der PHP-Interpreter sich beendet hat...
          Ja, im Normalfall. Ich möchte dem Browser signalisieren daß die Seite vollständig gesendet wurde, bevor mein PHP-Script endet, da ich dann noch einige zeitaufwendige Dinge (DB) erledigen möchte. So funktioniert es jetzt (im FF):
          PHP-Code:
          <?php
          header
          ('Content-Type: text/html; charset=UTF-8');
          ob_start();
          error_reporting(-1);
          echo 
          "Ein Test<br>";
          $out ob_get_contents();
          $lout strlen($out);
          header("Content-Length: ".$lout);
          ob_flush();
          flush();
          //Simulation eines zeitaufwendigen Scriptteiles
          usleep(5000000);
          ?>
          Den Unterschied sieht man, wenn die header-Zeile mit Content-Length auskommentiert wird.

          Kommentar


          • #6
            na hast du ein Glück mit deinem OutputBuffering - normal sendest du ja den 2ten Header NACH dem echo ... und damit provozierst du ja die nächste bekannte Fehlermeldung
            "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

            Kommentar


            • #7
              Das Ganze geht nur über OutputBuffering, wie soll ich sonst an die Content-Length kommen?

              Kommentar


              • #8
                Indem du das was du ausgeben willst in einer Variable sammelst, die länge feststellst und diese Variable danach ausgibst ? ^^
                [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                Kommentar


                • #9
                  Ja, logisch, man denkt oft zu kompliziert

                  PHP-Code:
                  <?php
                  header
                  ('Content-Type: text/html; charset=UTF-8');
                  $buf "Ein Test<br>";
                  $buf .= "Eine 2.Zeile<br>";
                  $lout strlen($buf);
                  header("Content-Length: ".$lout);
                  echo 
                  $buf;
                  flush();
                  //Simulation eines zeitaufwendigen Scriptteiles
                  $content date("d-m-Y H:i:s")."\r\n";
                  usleep(5000000);
                  $content .= date("d-m-Y H:i:s")."\r\n";
                  file_put_contents("header_content.txt"$content);
                  ?>
                  Während der Browser schon Fertig meldet, läuft PHP weiter und macht hier als Demo eine Dateiausgabe. Im echten Projekt wird eine Datenbank aufgeräumt.

                  Kommentar


                  • #10
                    In einem "echten Projekt" wird die Datenbank per Cronjob aufgeräumt, wenn das immer nach einem bestimmten Scriptaufruf passieren soll, legt man entsprechende Jobs in einem extra Table in der Datenbank fest und lässt den Cronjob diese Jobs abarbeiten. Der Browser bekommt seinen "Fertig" status am Scriptende. Denn der Apache vermeldet "Fertig" auch erst dann wenn das Script fertig ist das der Apache in seinem Worker ausführt..
                    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                    Kommentar


                    • #11
                      Zitat von tr0y Beitrag anzeigen
                      Der Browser bekommt seinen "Fertig" status am Scriptende. Denn der Apache vermeldet "Fertig" auch erst dann wenn das Script fertig ist das der Apache in seinem Worker ausführt..
                      Vestehe ich nicht. Obiges soll beim Apache nicht funktionieren?

                      Kommentar


                      • #12
                        Wohl bei keinem Webserver, ein "beendetes laden" des Scripts ist dann vollzogen wenn das Script beendet ist, nicht wenn der Content-Length-Wert am Zielbrowser erreicht ist.
                        [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                        Kommentar


                        • #13
                          Also bei mir local (XAMPP=Apache) funktioniert es.

                          Edit: auch auf einem kleinen Linux mit Apache, Browser FF + IE ok.

                          Kommentar


                          • #14
                            das kommt wohl auf den vollständigen Header an - es gibt ja diesen Header-Parameter, der ankündigt dass die Seite in Bröckchen ankommt - damit dürfte deine Variante funktionieren - möglich, dass ihn der Xampp automatisch sendet - manch anderer Webserver aber nicht, in dem Fall wird auf die vollständige Abarbeitung des Scriptes gewartet, weil erst dieses den Workerthread animiert, das Ende der Seite zu signalisieren und sich seinerseits zu beenden
                            "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

                            Kommentar

                            Lädt...
                            X