Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] flush und seine Probleme

Einklappen

Neue Werbung 2019

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

  • [Erledigt] flush und seine Probleme

    Hallo Leute,

    ich bin ernsthaft verwirrt.
    Ich versuch momentan ein sage ich mal "live" Ausgabe mit php zu schaffen.

    Folgendes habe ich probiert:
    PHP-Code:
    for($i=0;$i<10;$i++){
        
    ob_start();
        
    sleep(1);
        print 
    date('h:i:s').'<br />';
        
    ob_end_flush();
        
    flush();

    Nur leider ohne Erfolg, da alle ausgaben mit einmal gemacht werden.

    Nun meine Frage, wie kann ich das umgehen bzw. ändern das es nicht mit einmal kommt ?

    mfg
    Flo

  • #2
    Meiner Meinung nach hast du das falsch strukturiert. Beachte, dass die Lösung trotzdem nicht sinnvoll ist und nicht auf jedem Server funktioniert!

    PHP-Code:
    <?php
        ob_start
    ();
        for (
    $i 0$i 10$i++) {
            
    sleep(1);
            echo 
    date('h:i:s'), '<br />';
            
    flush(); ob_flush();
        }
        
    ob_end_flush();
    ?>

    Kommentar


    • #3
      Zitat von ChristianK Beitrag anzeigen
      Meiner Meinung nach hast du das falsch strukturiert. Beachte, dass die Lösung trotzdem nicht sinnvoll ist und nicht auf jedem Server funktioniert!

      PHP-Code:
      <?php
          ob_start
      ();
          for (
      $i 0$i 10$i++) {
              
      sleep(1);
              echo 
      date('h:i:s'), '<br />';
              
      flush(); ob_flush();
          }
          
      ob_end_flush();
      ?>
      Gibt es da nicht ne generelle Lösung, weil deine funktioniert eider nicht auf xampp apache server .

      Kommentar


      • #4
        Zitat von Feirell Beitrag anzeigen
        Nur leider ohne Erfolg, da alle ausgaben mit einmal gemacht werden.
        Mit jedem Request wird der PHP-Code vollständig abgearbeitet. Deshalb ist es völlig normal, dass PHP die for-Schleife abarbeitet und dir am Ende alles ausgibt, wie z.B.:
        PHP-Code:
        09:25:57
        09
        :25:58
        09
        :25:59
        09
        :26:00
        09
        :26:01
        09
        :26:02
        09
        :26:03
        09
        :26:04
        09
        :26:05
        09
        :26:06 
        Folglich müsstest du eine Schnittstelle schaffen, welche du mit Ajax in einem von dir festgelegten Intervall ansteuerst (Stichwort: Trigger).

        Kommentar


        • #5
          @Feirell: Ein Full-Quote des Posts direkt oben an dir ist reine Platzverschwendung! Bitte unterlasse das...

          @Trainmaster: Grundsätzlich ja, aber du hast die Möglichkeit, mit ob_* den Ausgabepuffer zu steuern bzw. bestimmte Zeilen schon zu senden bevor das Skript beendet ist.

          Ich tippe jedoch darauf, dass er nicht genau liest, was ich geschrieben habe, deshalb hier ein Zitat aus dem Manual (btw, das spielt auf XAMPP & win32 an )!
          Zitat von php.net
          Einige Webserver, besonders auf Windows (Win32), puffern ihre Scriptausgaben weiterhin bis zum Scriptende bevor sie sie zum Browser übertragen.

          Auch Apache-Module wie mod_gzip puffern zum Teil Ausgaben und verhindern so, dass Ausgaben nach flush() direkt zum Benutzer weitergegeben werden.

          Selbst Browser können empfangene Ausgaben puffern bevor sie sie tatsächlich darstellen. Netscape Browser z.B. puffern Text bis sie entweder einen Zeilenwechsel oder den Anfang eines Tags empfangen und zeigen Tabellen erst nach dem Empfang des </table> Tags der äußersten Tabelle.

          Kommentar


          • #6
            Zitat von Trainmaster Beitrag anzeigen
            Mit jedem Request wird der PHP-Code vollständig abgearbeitet. Deshalb ist es völlig normal, dass PHP die for-Schleife abarbeitet und dir am Ende alles ausgibt, wie z.B.:
            PHP-Code:
            09:25:57
            09
            :25:58
            09
            :25:59
            09
            :26:00
            09
            :26:01
            09
            :26:02
            09
            :26:03
            09
            :26:04
            09
            :26:05
            09
            :26:06 
            Folglich müsstest du eine Schnittstelle schaffen, welche du mit Ajax in einem von dir festgelegten Intervall ansteuerst (Stichwort: Trigger).
            Schade nur das ich keine Ahnung von AJAX habe ...

            Kommentar


            • #7
              Hast Du das mal versucht?
              PHP-Code:
              ob_implicit_flush(true);
              for(
              $i=0$i<10$i++) {
                  print 
              date('h:i:s').'<br />';
                  
              sleep(1);

              Für welchen Zweck benötigst Du das eigentlich? Solange es nur auf Deinem localhost stattfindet ist es ja in Ordnung, aber bei öffentlichen Seiten solltest Du längere Scriptlaufzeiten vermeiden.

              Kommentar


              • #8
                Zitat von ChristianK Beitrag anzeigen
                du hast die Möglichkeit, mit ob_* den Ausgabepuffer zu steuern bzw. bestimmte Zeilen schon zu senden bevor das Skript beendet ist.
                Da hast du recht. Allerdings belegt dein Zitat auch, dass es im Allgemeinen nur sehr schwer zu handhaben ist. Selbst wenn die Server-Einstellungen entsprechend angepasst werden können, kann immer noch der Browser einen Strich durch die Rechnung machen. Aus diesem Grund argumentiere ich erst gar nicht, dass es rein mit PHP funktionieren kann, wenn diese und jene Voraussetzungen gegeben sind, sondern verweise gleich auf Javascript. Trotzdem Danke für deinen Beitrag!

                @ Feirell
                Setz dich zunächst mit der Javascript-Funktion setInterval() auseinander, siehe http://de.selfhtml.org/javascript/ob...m#set_interval. Im nächsten Schritt beschäftigst du dich bspw. mit jQuery und dessen Ajax-Funktionalitäten, siehe http://api.jquery.com/jQuery.ajax/. Wenn du beides kombinierst, solltest du dein Problem lösen können.

                Kommentar


                • #9
                  @Trainmaster: Diesbezüglich gebe ich dir recht - Javascript wird die bessere Lösung sein.

                  @TE: Wenn du jedoch wirklich eine Uhr basteln willst, musst du keine AJAX-Kentnisse haben. Die Uhrzeit weis der Browser schon selber. Das ginge dann mit Date-Objekten.

                  Kommentar


                  • #10
                    Mit jedem Request wird der PHP-Code vollständig abgearbeitet. Deshalb ist es völlig normal, dass PHP die for-Schleife abarbeitet und dir am Ende alles ausgibt, wie z.B.:
                    Der erste Satz ist richtig, der zweite nicht. Denn genau dazu gibt es flush().

                    Mir ist nicht klar, wozu hier überhaupt der ob-Buffer bemühr wird.

                    Kommentar


                    • #11
                      XAMPP hat von Hause aus einen großen Ausgabepuffer aktiv (bei mir 4k). Um den per PHP zu überlisten, muß man in die Trickkiste greifen:
                      PHP-Code:
                      <?php
                      $bufCount 
                      ini_get("output_buffering") + 128;
                      for(
                      $i=0;$i<10;$i++){
                          
                      ob_start();
                          print 
                      date('h:i:s').'<br />';
                          echo 
                      str_repeat(' ',$bufCount);
                          
                      ob_end_flush();
                          
                      flush();
                          
                      sleep(1);
                      }  
                      ?>
                      LG jspit

                      Kommentar


                      • #12
                        Also ich weiß nicht was ihr da mit XAMPP für Probleme habt.
                        Auf meinem Windows-Rechner reicht jeweils ein flush() oder ein ob_implicit_flush() am Anfang völlig aus.
                        Selbst wenn ich in einer Schleife jeweils nur eine Zahl ausgebe.

                        Kommentar


                        • #13
                          PHP ist einfach nicht dafür gedacht, "live" was auszugeben, das ist eine typische AJAX/JavaScriptanwendung, finde ich, und das ist mit jQuery, hier ja schon angesprochen, auch nicht schwer zu realisieren.

                          Kommentar

                          Lädt...
                          X