Michael - Hannover: Verständnisfrage zur Funktion "flush()"

Hola !

laut PHP Handbuch
"flush --  Der Ausgabe-Puffer wird geleert und alle Zeichen ausgegeben
"

heißt das jetzt, dass ohne flush() Befehl im Script der (apache)Server bis zum Ende des Scriptes (oder Buffers) wartet bevor er was zum Client schickt ?

ist es dann sinnvoll z.B. in Klassen/Funktionen generell ein "flush" vor dem return Befehl zu setzen ? Oder lohnt sich dass erst bei größeren Projekten (Forum etc.) ?

MfG
Michael

  1. nein, es ist sicherlich nicht sindvoll ein fulsh vor ein return zu setzen, da es sicherlich gar keinen sinn macht. ích hab selbst ein größeres projekt (Forum) http://www.programming-time.de/portal/index.php?go=forum~A7~showboard/ und flush nicht verwendet!

  2. Hello,

    laut PHP Handbuch
    "flush --  Der Ausgabe-Puffer wird geleert und alle Zeichen ausgegeben"
    heißt das jetzt, dass ohne flush() Befehl im Script der (apache)Server bis zum Ende des Scriptes (oder Buffers) wartet bevor er was zum Client schickt ?

    das kommt darauf an, wie lange das Script läuft und welche Aufgabe es hat.
    Flush() funktioniert scheinbar nur auf Linux/Apache, nicht aaber auf Windows.
    Wir haben doch da gerade eine größere Untersuchung zum Locking als Thread. In den Testscripten wird auch Flush beunutzt, weil dei Scriote bis zum Connection_Aborted() laufen sollen, aber der User zwischendurch erfahren soll, dass das Script noch lebt.

    siehe [pref:t=85718&m=505199]

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Moin Tom,

      Flush() funktioniert scheinbar nur auf Linux/Apache, nicht aaber auf Windows.

      das ist mir aber gaaanz neu. Natürlich funktioniert der flush() auch unter Windoof. Die Eigenart dabei ist nur, daß man den Ausgabebuffer künstlich bis auf 256 Zeichen füllen muß, sonst wartet flush() bis der Buffer gefüllt ist.

      Das hier ist so eine Methode:
      print str_repeat(" ", 300) . "\n";

      Der flush() erwartet auch eine vollständige html Page, also nicht
      irgendwo zwischen <body> </body>. ( Wenn den eine Page augegeben werden soll )

      Gruß
      Mike

      --
      Murphy: "Wenn etwas schiefgehen kann, dann wird es auch schiefgehen."
      1. Hello,

        Flush() funktioniert scheinbar nur auf Linux/Apache, nicht aaber auf Windows.

        das ist mir aber gaaanz neu. Natürlich funktioniert der flush() auch unter Windoof. Die Eigenart dabei ist nur, daß man den Ausgabebuffer künstlich bis auf 256 Zeichen füllen muß, sonst wartet flush() bis der Buffer gefüllt ist.

        Das hier ist so eine Methode:
        print str_repeat(" ", 300) . "\n";

        Der flush() erwartet auch eine vollständige html Page, also nicht
        irgendwo zwischen <body> </body>. ( Wenn den eine Page augegeben werden soll )

        Wenn es schon ginge, würde ich diesen Thread in das Projekt aufnehem un d reistrieren. *gg*
        Ich werde mir das aber mal merken und zu gegebener Zeit darauf zurückkommen. Im Moment sehe ich jedenfalls keine Verifikation für diese Aussage.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Moin Tom,

          Wenn es schon ginge, würde ich diesen Thread in das Projekt aufnehem un d reistrieren. *gg*
          Ich werde mir das aber mal merken und zu gegebener Zeit darauf zurückkommen. Im Moment sehe ich jedenfalls keine Verifikation für diese Aussage.

          diese Aussage ist definitiv TRUE, ich verwende Flush() in einem Intranet Projekt, und es funtzt!

          Gruß
          Mike

          --
          Murphy: "Wenn etwas schiefgehen kann, dann wird es auch schiefgehen."
          1. Hallo, Mike!

            diese Aussage ist definitiv TRUE, ich verwende Flush() in einem Intranet Projekt, und es funtzt!

            das hier auch?
                    <?php
                    static $i = 0;
                    while ($i < 5) {
                        ++$i;
                            print str_repeat(" ", 300).$i."<br>\n";
                        flush();
                        sleep(1);
                    }
                    ?>

            kannst du uns evtl. mal deine httpd.conf zeigen, das wir mit unserer vergleichen können? an irgendwas muss es ja liegen.
            könnte es an der gzip-komprimierung des apache liegen?
            welche software (apache-/php-version, OS) verwendest du?

            freundl. Grüsse aus Berlin, Raik

            1. Moin Raik,

              <?php
                      static $i = 0;
                      while ($i < 5) {
                          ++$i;
                              print str_repeat(" ", 300).$i."<br>\n";
                          flush();
                          sleep(1);
                      }
                      ?>
              kannst du uns evtl. mal deine httpd.conf zeigen, das wir mit unserer vergleichen können? an irgendwas muss es ja liegen.
              könnte es an der gzip-komprimierung des apache liegen?
              welche software (apache-/php-version, OS) verwendest du?

              ich habe dein Script kopiert und getestet. Es funktioniert.

              Microsoft-IIS/5.0 / PHP 4.2.2 / WIN2000 + XP

              Daher keine httpd.conf :-(

              Gruß
              Mike

              --
              Murphy: "Wenn etwas schiefgehen kann, dann wird es auch schiefgehen."
              1. Hello,

                <?php
                        static $i = 0;
                        while ($i < 5) {
                            ++$i;
                                print str_repeat(" ", 300).$i."<br>\n";
                            flush();
                            sleep(1);
                        }
                        ?>
                kannst du uns evtl. mal deine httpd.conf zeigen, das wir mit unserer vergleichen können? an irgendwas muss es ja liegen.
                könnte es an der gzip-komprimierung des apache liegen?
                welche software (apache-/php-version, OS) verwendest du?

                ich habe dein Script kopiert und getestet. Es funktioniert.

                Microsoft-IIS/5.0 / PHP 4.2.2 / WIN2000 + XP

                Daher keine httpd.conf :-(

                Es wir ja immer spannender
                Wieso geht das dann bei der Apache-PHP-Version für Windows nicht?

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                1. Moin Tom und Raik,

                  <?php
                          static $i = 0;
                          while ($i < 5) {
                              ++$i;
                                  print str_repeat(" ", 300).$i."<br>\n";
                              flush();
                              sleep(1);
                          }
                          ?>

                  Es wir ja immer spannender

                  Wieso geht das dann bei der Apache-PHP-Version für Windows nicht?

                  Ich habe das oben stehende Script mal auf meinen eigenen WebServer implementiert. Bitte checked das mal, und sagt mir ob das funtzt oder nicht. Ich bin doch nicht doof :-))

                  http://geli.dnip.net/flush_test.php

                  Ich bin geeeeeeeeeeespannt!

                  Gruß
                  Mike

                  --
                  Murphy: "Wenn etwas schiefgehen kann, dann wird es auch schiefgehen."
                  1. Moin @ all,

                    laut Doku muss der Buffer auch nur bei Windoof aufgefüllt werden.
                    Ein Apache sollte den flush() sofort beherschen ohne den Buffer zu befüllen.

                    Gruß
                    Mike

                    --
                    Murphy: "Wenn etwas schiefgehen kann, dann wird es auch schiefgehen."
                    1. Hallo, Mike!

                      am script liegt es also nicht.
                      http://fakeraol.homeip.net/a_test/all_headers.php
                      kannst du das mal mit deiner config vergleichen?

                      freundl. Grüsse aus Berlin, Raik

                      1. Moin Rail,

                        am script liegt es also nicht.
                        http://fakeraol.homeip.net/a_test/all_headers.php
                        kannst du das mal mit deiner config vergleichen?

                        Net böse sein, aber vergleiche Du :-)

                        http://geli.dnip.net/php.php

                        Mike

                        --
                        Murphy: "Wenn etwas schiefgehen kann, dann wird es auch schiefgehen."
                        1. Hallo, Mike!

                          Net böse sein, aber vergleiche Du :-)

                          nöööö. :-D
                          warum sollte ich.
                          aber ich kann auch nix finden, was daran schuld sein könnte.
                          ich vermute mal, dass es am apache liegt, nur wo ... ?

                          freundl. Grüsse aus Berlin, Raik

                          1. Hallo, Tom und Mike!

                            <?php
                                    static $i = 0;
                                    while ($i < 5) {
                                        ++$i;
                                            print str_repeat(" ", 4096).$i."<br>\n";
                                        flush();
                                        sleep(1);
                                    }
                                    ?>
                            so tuts das auch bei mir [man beachte den erhöhten wert (4096)],
                            undzwar sowohl mit IE 6 als auch firefox 0.8 .
                            ich tippe auf einen puffer des apachen unter windows, möglicher weise auch bedingt durch das OS.

                            freundl. Grüsse aus Berlin, Raik

                            1. Hello,

                              print str_repeat(" ", 4096).$i."<br>\n";

                              Das wäre ja der implizite Beweis dafür, dass es flush() wirklich nicht tut, sondern nur der ausreichend gefüllte Buffer für das Absenden der Daten verantwortlich ist.

                              Fragt sich dann, was bei der

                              ob_start();
                              #schreibe schreibe
                              ob_end_flush()

                              dann unter Windows passiert.

                              Harzliche Grüße aus http://www.annerschbarrich.de

                              Tom

                              --
                              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                              Nur selber lernen macht schlau
                              1. Hallo, Tom!

                                Fragt sich dann, was bei der
                                ob_start();
                                #schreibe schreibe
                                ob_end_flush()
                                dann unter Windows passiert.

                                ohne str_repeat(" ", 4096). genausowenig, wie mit flush().
                                aber wenn man alle relevanten stellen damit präpariert, gehts.

                                freundl. Grüsse aus Berlin, Raik

                  2. Hallo, Mike!

                    print str_repeat(" ", 300).$i."<br>\n";

                    wenn es bei dir aber schon mit 300 läuft und bei mir erst mit 4096, dann kann es nur am apachen liegen oder an unterschieden zwischen win2000 (bei mir) und winXP (bei dir). oder hast du es auch unter win2000 probiert?

                    freundl. Grüsse aus Berlin, Raik

                    1. Moin Raik,

                      oder hast du es auch unter win2000 probiert?

                      Yep, Win2000 funtzt auch

                      Gruß
                      Mike

                      --
                      Murphy: "Wenn etwas schiefgehen kann, dann wird es auch schiefgehen."