Maja: sleep Funktion

Ich experementiere gerade mit der Sleep Funktion, doch ich bekoee es nicht so hin wie ich möchte....

  
$a = 0;  
while($a < 10)  
   {  
   $a++;  
	echo $a.'<br/>';  
	sleep(1);  
   }  

Wenn ich mein Script starte, dann passiert nichts und nach 10 Sekunden kommt die Ausgabe.
Wie bekomme ich es hin, das

die Ausgabe so ist
1
warte eine Sekunde
2
warte eine Sekunde
3
warte eine Sekunde
4
warte eine Sekunde

  1. Hi,

    Wenn ich mein Script starte, dann passiert nichts und nach 10 Sekunden kommt die Ausgabe.
    Wie bekomme ich es hin, das

    vielleicht gibts einen Browser, der es sofort ausgibt.

    Viele Grüße aus LA

    --
    ralphi
  2. Tach!

    Wenn ich mein Script starte, dann passiert nichts und nach 10 Sekunden kommt die Ausgabe.

    PHP hat einen Ausgabepuffer, der Webserver ebenso, und einige Browser puffern auch bevor sie ausgeben. Für PHP kann man das über die Funktionen der Ausgabesteuerung regeln, zum Beispiel mit flush(). Webserver sind meist auch gnädig und schicken beim flush() die Ausgabe los. Auf die Browser hast du üblicherweise keinen Einfluss.

    dedlfix.

    1. Hi dedlfix,

      PHP hat einen Ausgabepuffer, der Webserver ebenso, ..

      Wo find ich denn den Ausgabepuffer in der php.ini?
      Mit CLI geht’s natürlich direkt auf den Bildschirm. Dachte meine ini’s (Cli, Apache) wären nahezu gleich.

      Viele Grüße aus LA

      --
      ralphi
      1. Tach!

        PHP hat einen Ausgabepuffer, der Webserver ebenso, ..
        Wo find ich denn den Ausgabepuffer in der php.ini?

        http://php.net/manual/en/book.outcontrol.php

        Mit CLI geht’s natürlich direkt auf den Bildschirm. Dachte meine ini’s (Cli, Apache) wären nahezu gleich.

        An der Kommandozeile gibt es per Default keine Ausgabesteuerung. Man kann sie aber zur Laufzeit einschalten. Siehe http://php.net/manual/en/features.commandline.differences.php - Erklärung zur Direktive output_buffering.

        dedlfix.

        1. Hi dedlfix, Jörg,

          Interessant, dass es so was gibt :-)
          An Maja’s Stelle, hätte jetzt NUR am Browser gedreht, bzw. nach einem Browser gesucht der nicht buffert, bzw. Eine Zählervariante, wenn für public, mit JS gelöst.

          Viele Grüße aus LA

          --
          ralphi
      2. Mit CLI geht’s natürlich direkt auf den Bildschirm. Dachte meine ini’s (Cli, Apache) wären nahezu gleich.

        diff könnte da weiter helfen. (Tut es aber in Bezug auf die Frage nicht!)

        Die hilft das hier:

        http://php.net/output-buffering -> http://php.net/manual/de/outcontrol.configuration.php#ini.output-buffering

        Jörg Reinholz

    2. ich hab das mit flush() mal ausprobiert.
      Aber es hilft leider nicht.

      Man kann es auch hier testen: http://phptester.net/

        
      <?php  
        
      if (ob_get_level() == 0) ob_start();  
        
      $a = 0;  
      $b = 3;  
      while($a < $b)  
      	{  
      	$a++;  
      	ob_flush();  
      	flush();  
      	  
      	echo 'Das soll '.$b.' mal angeziegt werden: '.$a.'<br/>';  
      	  
      	sleep(1);  
      	}  
        
      ob_end_flush();  
        
      ?> 
      
      1. ich hab das mit flush() mal ausprobiert.
        Aber es hilft leider nicht.

        probiers mal wie im Beispiel von php.net - also erst nach echo senden.

        This will show each line at a time with a pause of 2 seconds.  
        (Tested under IEx and Firefox)  
          
        <?php  
          
        if (ob_get_level() == 0) ob_start();  
          
        for ($i = 0; $i<10; $i++){  
          
                echo "<br> Line to show.";  
                echo str_pad('',4096)."\n";  
          
                ob_flush();  
                flush();  
                sleep(2);  
        }  
          
        echo "Done.";  
          
        ob_end_flush();  
          
        ?>
        

        Viele Grüße aus LA

        --
        ralphi
        1. probiers mal wie im Beispiel von php.net - also erst nach echo senden.

          Entscheidend ist hier vermutlich das str_pad, das flush nach der Ausgabe sorgt "nur" dafür, daß der Text nicht um 1 Sekunde verzögert ausgegeben wird.

        2. Hakuna matata!

          <?php

          if (ob_get_level() == 0) ob_start();
          ob_end_flush();

          ?>

            
          Solcher Code hat mir mal tiefes Kopfzerbrechen und stundenlange Fehlersuche bereitet. Du löschst hier unter Umständen einen Ausgabebufer, den du selber nicht angelegt hast. Das Modul von dem der Buffer stammt, wird mit aller Wahrscheinlichkeit nicht mehr ordnungsgemäß funktionieren.  
            
          Folgende Faustregel hab ich mir damals zurecht gelegt, damit das nicht passiert. Man sollte nie mehr Buffer öffnen, als man selber schließt, und man sollte nie mehr Buffer schließen, als man selber geöffnet hat. Es gibt Gründe dafür, dass man Ausgabe-Buffer verschachteln kann, leider leider benutzt PHP dafür globale Zustände, was die Anwednung extrem fehleranfällig macht.  
          
          -- 
          “All right, then, I'll go to hell.” – Huck Finn
          
      2. Tach!

        ich hab das mit flush() mal ausprobiert. Aber es hilft leider nicht.

        Tja, wenn es nicht will, geht es nicht. In der Doku zu flush() stehen eine Menge Gründe, warum es möglicherweise nicht funktionieren kann.

        Heutzutage kann man aber auch anders mit dem Browser kommunizieren, beispielsweise über WebSockets. Aber mehr kann ich dazu auch nicht sagen.

        dedlfix.

      3. Liebe Mitdenker,
        liebe Wissende,
        liebe Neugierige,

        ja!

        ich hab das mit flush() mal ausprobiert.
        Aber es hilft leider nicht.

        Man kann es auch hier testen: http://phptester.net/

        <?php

        while (ob_get_level() > 0) ob_end_flush();

        $a = 0;
        $b = 3;
        while($a < $b)
        {
        $a++;

        flush();

        echo 'Das soll '.$b.' mal angeziegt werden: '.$a.'<br/>';

        sleep(1);
        }

        ?>

          
          
        Spirituelle Grüße  
        Euer Robert
        
        -- 
        Möge der Forumsgeist wiederbelebt werden!
        
        1. Hakuna matata!

          <?php
          while (ob_get_level() > 0) ob_end_flush();
          ?>

            
          Du machst den selben [Fehler wie ralphi](https://forum.selfhtml.org/?t=219209&m=1513073). Du löschst ohne Rücksicht fremde Ausgabebuffer, die Skripte, die diese geöffnet haben, hatten dafür mit Sicherheit ihre Gründe und werden danach nicht mehr ordentlich arbeiten können. Ausgabebuffer werden in der Regel dafür eingesetzt, die Daten nochmal durch einen Postprozessor nachzubereiten. Zum Beispiel, um kurz vor der Ausgabe die HTML-Daten in eine PDF-Datei zu konvertieren.  
            
          Es kann natürlich sein, dass ein Ausgabebuffer geöffnet ist, und dass aus diesem Grund die Daten nicht sofort an den Nutzer weitergeschickt werden können. Aber anstatt dann stumpf mit dem Kopf durch die Wand zu rennen und alle Ausgabebuffer rücksichtslos zu schließen, sollte man den Fall mal ordentlich untersuchen und herausfinden, ob es überhaupt Sinn ergibt die beiden Konflikskripte gleichzeitig auszuführen, oder ob es nicht mehr Sinn ergibt, dass buffernde Skript erst gar nicht laufen zu lassen, wenn das Realtime-Skript läuft.  
          
          -- 
          “All right, then, I'll go to hell.” – Huck Finn
          
          1. Nur der Korrektheit halber:

            Du machst den selben Fehler wie ralphi.

            Ich hab noch nie mit flush() gearbeitet und werd es auch nicht. Bis dato wusste ich noch nicht mal, dass php einen buffer hat.
            Ergo hab ich auch keinen Fehler gemacht !
            Den code von Maja hab ich nur mit dem Beispiel aus php.net verglichen und Unterschiede festgestellt.

            Viele Grüße aus LA

            --
            ralphi
          2. Liebe Mitdenker,
            liebe Wissende,
            liebe Neugierige,

            ja!

            Du machst den selben Fehler wie ralphi.

            Die Aufgabe lautete, möglichst SOFORT eine Ausgabe zu veranlassen. Ob da noch andere Puffer aktiv waren, hat mich in dem Moment nicht interessiert. Ich wollte Maja damit nur darauf aufmerksam machen, dass die Puffer geschachtelt sind!

            Bei Eingriffen in ein System muss man immer mit Nebenwirkugen rechnen ;-P

            Spirituelle Grüße
            Euer Robert

            --
            Möge der Forumsgeist wiederbelebt werden!
            1. Hakuna matata!

              Du machst den selben Fehler wie ralphi.

              Die Aufgabe lautete, möglichst SOFORT eine Ausgabe zu veranlassen. Ob da noch andere Puffer aktiv waren, hat mich in dem Moment nicht interessiert.

              Na offensichtlich doch, denn du schließt sie immerhin. Stattdessen wäre eine Fehlermeldung wohl angebracht:

              if ( ob_get_level() > 0 ) {  
                 trigger_error('Es ist keine Echtzeit-Ausgabe möglich, weil Ausgabebuffer aktiv sind.', E_USER_WARNING );  
              }
              

              Ich wollte Maja damit nur darauf aufmerksam machen, dass die Puffer geschachtelt sind!

              Du hattest sicher eine gute Absicht dabei, aber die Art, auf die du das vermittelt hast, ist eben unglücklich ausgefallen. Anfänger neigen nunmal dazu fremden Code einfach zu kopieren, ohne ihn in jedem Dateil zu hinterfragen. Aber diese while-Schleife ist eben ganz miserabler Code, der es niemals in ein Produktivsystem schaffen sollte.

              Bei Eingriffen in ein System muss man immer mit Nebenwirkugen rechnen ;-P

              Wenn diese while-Schleife tatsächlich mal ausgeführt wird, geht mit Sicherheit was kaputt. Das ist keine Nebenwirkung, das ist die Auswirkung. Wenn man einen Elefant in einen Porzellanladen stellt, geht auch mit Sicherheit was kaputt.

              --
              “All right, then, I'll go to hell.” – Huck Finn
              1. Liebe Mitdenker,
                liebe Wissende,
                liebe Neugierige,

                ja!

                Na offensichtlich doch, denn du schließt sie immerhin. Stattdessen wäre eine Fehlermeldung wohl angebracht:

                *lalala* ;-P

                if ( ob_get_level() > 0 ) {

                trigger_error('Es ist keine Echtzeit-Ausgabe möglich, weil Ausgabebuffer aktiv sind.', E_USER_WARNING );
                }

                  
                Das ist einerseits eine gute Idee, aber soweit ich weiß, wird neuerdings immer mindestens \_ein\_ Buffer geöffnet, und dann damit ist die Idee dann doch nicht mehr so gut als pauschale Lösung.  
                  
                  
                
                > > Ich wollte Maja damit nur darauf aufmerksam machen, dass die Puffer geschachtelt sind!  
                >   
                > Du hattest sicher eine gute Absicht dabei, aber die Art, auf die du das vermittelt hast, ist eben unglücklich ausgefallen. Anfänger neigen nunmal dazu fremden Code einfach zu kopieren, ohne ihn in jedem Dateil zu hinterfragen. Aber diese while-Schleife ist eben ganz miserabler Code, der es niemals in ein Produktivsystem schaffen sollte.  
                  
                Seine Applikation muss jeder selber kennen. Ich weiß ja nichts darüber, weil Maja nix erzählt hat.  
                  
                  
                
                > > Bei Eingriffen in ein System muss man immer mit Nebenwirkugen rechnen ;-P  
                >   
                > Wenn diese while-Schleife tatsächlich mal ausgeführt wird, geht mit Sicherheit was kaputt. Das ist keine Nebenwirkung, das ist die Auswirkung. Wenn man einen Elefant in einen Porzellanladen stellt, geht auch mit Sicherheit was kaputt.  
                  
                Das weiß nur der Entwickler der Software, die da manipuliert werden soll.  
                  
                Und wenn es nur um einen Versuch gibt, eine "Echtzeitausgabe" zu verwirklichen, was soll kaputt gehen? Weder PHP noch der Apache werden schaden nehmen dadurch :-P  
                  
                  
                  
                  
                  
                Spirituelle Grüße  
                Euer Robert
                
                -- 
                Möge der Forumsgeist wiederbelebt werden!
                
                1. Hakuna matata!

                  if ( ob_get_level() > 0 ) {

                  trigger_error('Es ist keine Echtzeit-Ausgabe möglich, weil Ausgabebuffer aktiv sind.', E_USER_WARNING );
                  }

                  
                  >   
                  > Das ist einerseits eine gute Idee, aber soweit ich weiß, wird neuerdings immer mindestens \_ein\_ Buffer geöffnet, und dann damit ist die Idee dann doch nicht mehr so gut als pauschale Lösung.  
                    
                  Du meinst vermutlich den internen [System-Ausgbebuffer](http://php.net/manual/en/function.flush.php) von PHP. Der hat aber nichts mit den ob\_\*-Funktionen zu tun, und ob\_get\_level() zählt ihn auch nicht mit. Der Systembuffer verbirgt sich eine Schicht unter der Anwenderschicht.  
                    
                  Ein ob-Ausgabebuffer ist standardmäßig jedenfalls nicht aktiviert.  
                  
                  -- 
                  “All right, then, I'll go to hell.” – Huck Finn
                  
                  1. Liebe Mitdenker,
                    liebe Wissende,
                    liebe Neugierige,

                    ja!

                    Ein ob-Ausgabebuffer ist standardmäßig jedenfalls nicht aktiviert.

                    Dann ist das bei meinen Hosts wahrscheinlich anders, als bei anderen :-)

                    Spirituelle Grüße
                    Euer Robert

                    --
                    Möge der Forumsgeist wiederbelebt werden!