Kermit: Teil der Body vorher an Client schon senden

Hi,

ich kenne von anderen Sprachen das man header vorher senden kann
und anschliesend ein Teil von Body hinterher.

Gibt es etwas ähnliches in php?

Mit header() sendet man den header aber wie schickt man body Teile hinterher?

BSP:

header (...); // header wird gesendet

for ($i=0; $i<100; $i++) {
  echo ($i.'<br>');
  ??sende_body?? // user sieht etwas
  mach was anderes ...
}

Vorteil dabei: der Client sieht etwas
bevor mein PHP Script ganz durchgelaufen ist.

Vielen Dank
Kermit

  1. Gibt es etwas ähnliches in php?

    Also etwa wie auf der Toilette, wenn man Durchfall hat - man sollte zwischendurch immer mal spülen.

    1. »» Gibt es etwas ähnliches in php?

      Also etwa wie auf der Toilette, wenn man Durchfall hat - man sollte zwischendurch immer mal spülen.

      danke ... genau das habe ich gemeint ... jetzt werde ich noch öfter spülen

    2. Hello,

      Gibt es etwas ähnliches in php?

      Also etwa wie auf der Toilette, wenn man Durchfall hat - man sollte zwischendurch immer mal spülen.

      *rotfl*

      Du hast mir den Tag gerettet!

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hello,
        »» > Gibt es etwas ähnliches in php?
        »»
        »» Also etwa wie auf der Toilette, wenn man Durchfall hat - man sollte zwischendurch immer mal spülen.

        *rotfl*

        Du hast mir den Tag gerettet!

        Ajax nicht vergessen ;-)

        SCNR;
        Hotti

        Ne, mal ernsthaft: Ajax. Kommt bei mir zum Einsatz, wenn nach einem vom Benutzer ausgelösten serverseitigem Prozess _Teile_ der Seite geändert werden sollten.

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
        1. Ajax ist cool.

          Danke, aber ich möchte an diese Stelle keine Teile einer Webseite vorladen
          sonder wenn der User auf ein Button klickt soll ein batch script ausgeführt
          werden das 20 s dauern kann. Daher will ich nur ein Hinweis ausgeben das
          der Script gestartet wurde und bitte warten.

          das tut genau das was ich wollte:
                  echo('Bitte warten, Script wird gestartet.<br>');
            @ob_flush();
            flush();
            sleep(3);

          Gruß
          Kermit

          »» Hello,
          »» »» > Gibt es etwas ähnliches in php?
          »» »»
          »» »» Also etwa wie auf der Toilette, wenn man Durchfall hat - man sollte zwischendurch immer mal spülen.
          »»
          »» *rotfl*
          »»
          »» Du hast mir den Tag gerettet!

          Ajax nicht vergessen ;-)

          SCNR;
          Hotti

          Ne, mal ernsthaft: Ajax. Kommt bei mir zum Einsatz, wenn nach einem vom Benutzer ausgelösten serverseitigem Prozess _Teile_ der Seite geändert werden sollten.

          1. Hello,

            @ob_flush();

            Das ist jetzt eingentlich ein Pardoxon. Wenn man die OB-Funktionen benutzt, will man i.d.R. keine Ausgabe, bevor das Script nicht beendet ist. Das hängt ja nicht immer mit den Headern zusammen, sondern kann auch mit "Templates durch die Hintertür" zu tun haben, ähnlich der automatischen Sessionbehandlung von PHP.

            Aber wenn man schon den Outputbuffer absendet, und hat keinen Überblick über die Gründe von dessen Nutzung, dann sollte man daran denken, dass die Outputbuffer kaskadierbar sind. Und wenn Du dann vom Batch-Mode wieder zurück zum direkten Mode willst, dann müsstest Du eigentlich die gesamte Kaskade der Outputbuffer leeren

            http://de2.php.net/manual/en/function.ob-get-level.php

            alo eine Schleife nutzen. Dann kannst Du Dir auch das @ verkneifen.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hi,

              Das ist jetzt eingentlich ein Pardoxon.

              Ja, aber eine mitunter notwendige Maßnahme gegen PHP-Schluckauf. ;)

              Dann kannst Du Dir auch das @ verkneifen.

              Er hat es von mir abgeschrieben, und glaube mir, ich habe mir dabei was gedacht!

              Auch wenn ich jetzt so spontan nicht mehr so genau sagen kann, was. >:-> Die Antwort dürfte sich in den User-Kommentaren des PHP-Manuals befinden oder in meinem  Erfahrungsschatz oder in beidem ... ;)

              Gruß, Cybaer

              --
              Zweck des Disputs oder der Diskussion soll nicht der Sieg, sondern der Gewinn sein.
              (Joseph Joubert, Schriftsteller)
              1. Hello,

                Dann kannst Du Dir auch das @ verkneifen.

                Er hat es von mir abgeschrieben, und glaube mir, ich habe mir dabei was gedacht!

                Auch wenn ich jetzt so spontan nicht mehr so genau sagen kann, was. >:-> Die Antwort dürfte sich in den User-Kommentaren des PHP-Manuals befinden oder in meinem  Erfahrungsschatz oder in beidem ... ;)

                Na, dann such doch nochmal. Vielleicht kannst Du uns dann wieder in die Realität führen :-)

                Wenn ich

                while(ob_get_level > 0)
                   {
                       ### buffer auflösen
                   }

                benutzte, sollte das @ doch obsolete werden?

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Hi,

                  Na, dann such doch nochmal.

                  Echt keine Zeit und Lust und beides und überhaupt. :)

                  benutzte, sollte das @ doch obsolete werden?

                  Benutze ich aber in dem Countdown-Script nicht.

                  Nur in meinem Framework benutze ich eine ähnliche Variante.

                  Ansonsten: s.o. ("Lustfaktor") :)

                  Gruß, Cybaer

                  --
                  Zweck des Disputs oder der Diskussion soll nicht der Sieg, sondern der Gewinn sein.
                  (Joseph Joubert, Schriftsteller)
                  1. Hello,

                    Ansonsten: s.o. ("Lustfaktor") :)

                    Also du postet, obwohl Du eigentlich gar keine Lust dazu hast?

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                    Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                    1. Hi,

                      »» Ansonsten: s.o. ("Lustfaktor") :)
                      Also du postet, obwohl Du eigentlich gar keine Lust dazu hast?

                      Nein, ich poste, *wozu* ich Lust habe!

                      Foren sind abends (und mitunter auch sonst ;->) für mich in der Beziehung, was RTL-2 für den H4ler ist: Davorhocken, aber bitte nichts anspruchsvolles, nichts, wo man nachdenken oder sich anstrengen oder sonstwas tun müßte ... :->

                      Gruß, Cybaer

                      --
                      Zweck des Disputs oder der Diskussion soll nicht der Sieg, sondern der Gewinn sein.
                      (Joseph Joubert, Schriftsteller)
                      1. Hello,

                        Foren sind abends (und mitunter auch sonst ;->) für mich in der Beziehung, was RTL-2 für den H4ler ist: Davorhocken, aber bitte nichts anspruchsvolles, nichts, wo man nachdenken oder sich anstrengen oder sonstwas tun müßte ... :->

                        Achso, dann schicke ich Dir ein

                        Entspann Dich und ordne Deine guten Ideen :-)

                        Liebe Grüße aus dem schönen Oberharz

                        Tom vom Berg

                        --
                        Nur selber lernen macht schlau
                        http://bergpost.annerschbarrich.de
  2. Hi,

    Gibt es etwas ähnliches in php?

    Mit ob_flush() bzw. flush() und danach noch ein sleep().

    Aber manche Browser fangen erst bei 1024 Bytes an, was zu zeigen. Also vorher ggf. Leerzeichen senden ...

    Beispiel: http://Coding.binon.net/Countdown

    Gruß, Cybaer

    --
    Zweck des Disputs oder der Diskussion soll nicht der Sieg, sondern der Gewinn sein.
    (Joseph Joubert, Schriftsteller)
  3. Hello,

    BSP:

    header (...); // header wird gesendet

    for ($i=0; $i<100; $i++) {
      echo ($i.'<br>');
      ??sende_body?? // user sieht etwas
      mach was anderes ...
    }

    Das ist schon oft diskutiert worden.

    Dass das funktioniert ist aus vielen Grünen unsicher:

    • PHP hat einen Ausgabebuffer (z.B. 8kB groß), der nur geleert wird, wenn er voll ist,
        das Script endet, oder ein flush() ausgelöst wird.

    • Der Webserver, der die Ausgabe übernimmt, hat wiederum einen eigenen Buffer

    • Auf dem HTTP-Übertagungswege vom Server zum Client sitzen Proxies oder Hobs mit
        eigenen Buffern, die nicht auf die Header (nicht zwischenspeichern) hören

    • Der Client rendert, wann er will und nicht sofort, wenn er Daten bekommen hat.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hi,

      • Auf dem HTTP-Übertagungswege vom Server zum Client sitzen Proxies oder Hobs
        mit eigenen Buffern, die nicht auf die Header (nicht zwischenspeichern) hören

      ? Verwechselst Du da nicht was?

      • Der Client rendert, wann er will und nicht sofort, wenn er Daten bekommen hat.

      Wohl war. Der Navigator selig renderte z.B. IIRC erst, nachdem er "logische Blöcke" (also z.B. einen kompletten Absatz) hatte.

      Die heute gängigen Desktop-Browser rendern aber AFAIK alle das, was sie haben (mindetens sofern es sich um HTML handelt, und nicht um echtes XHTML).

      Gruß, Cybaer

      --
      Zweck des Disputs oder der Diskussion soll nicht der Sieg, sondern der Gewinn sein.
      (Joseph Joubert, Schriftsteller)
      1. Hello,

        • Auf dem HTTP-Übertagungswege vom Server zum Client sitzen Proxies oder Hobs
          mit eigenen Buffern, die nicht auf die Header (nicht zwischenspeichern) hören

        ? Verwechselst Du da nicht was?

        Wie meinst Du das?

        Es könnten doch Proxies auf dem Wege sitzen, die nur komplette HTTP-Dokumente weitergeben...

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hi,

          »» ? Verwechselst Du da nicht was?
          Wie meinst Du das?

          Was haben Header "nicht zwischenspeichern" mit der Verarbeitung des "streams" zu tun? Entweder IMHO nichts, oder Du meinst Header, die ich nicht kenne.

          Es könnten doch Proxies auf dem Wege sitzen, die nur komplette HTTP-Dokumente weitergeben...

          Könnte, wäre, wenn ... =:-) Gibt es das?
          Woher wüßte ein Proxy, daß er mit dem Weiterleiten warten soll? Wenn ich einen Größen-Header mitsende, und die Größe noch nicht erreicht ist (und das müßte der Proxy auch noch auswerten -> Performanceverschwendung). Aber sonst?

          Gruß, Cybaer

          --
          Zweck des Disputs oder der Diskussion soll nicht der Sieg, sondern der Gewinn sein.
          (Joseph Joubert, Schriftsteller)
          1. Yerf!

            » Es könnten doch Proxies auf dem Wege sitzen, die nur komplette HTTP-Dokumente weitergeben...

            Könnte, wäre, wenn ... =:-) Gibt es das?

            Proxys mit integriertem Virenscanner (in Firmennetzwerken öfters anzutreffen) neigen zu solchem Verhalten. (zumindest sammeln sie erst größere Blöcke um sie dann zu scannen)

            Gruß,

            Harlequin

            --
            <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
            1. Hi,

              Proxys mit integriertem Virenscanner (in Firmennetzwerken öfters anzutreffen) neigen zu solchem Verhalten. (zumindest sammeln sie erst größere Blöcke um sie dann zu scannen)

              Oh jo, an die habe ich gar nicht gedacht. Viel zu anspruchsvoll ... ;->

              Gruß, Cybaer

              --
              Zweck des Disputs oder der Diskussion soll nicht der Sieg, sondern der Gewinn sein.
              (Joseph Joubert, Schriftsteller)