ralphi: In Seite - Aktualisierungsintervall einbauen

hi leute,

diesmal such ich die Möglichkeit, in php,
ähnlich wie in HTML 'http-equiv="refresh' , die seite oder einen teil des php Programms nach einer Verweildauer von 5sec zu aktualisieren (wiederholen).

gesucht hab ich nach - load, refresh und Funktionen .. ohne erfolg
auch der Einbau von sleep und goto, führt nicht zum erfolg

kennt jemand die funktion in PHP dafür?

grüße aus LA (Niederbayern)
ralphi

  1. Hi,

    diesmal such ich die Möglichkeit, in php,
    ähnlich wie in HTML 'http-equiv="refresh' , die seite oder einen teil des php Programms nach einer Verweildauer von 5sec zu aktualisieren (wiederholen).

    Du verkennst die Grundmechanismen von HTTP, für die PHP konzipiert worden war. HTTP ist pull-basiert: Der Client fordert etwas vom Server an, *dann* reagiert der Server und beendet seinen Job, sobald er die Antwort zurück geschickt hat. Das Protokoll sieht es nicht vor, dass der Server danach aktiv weiter agiert.

    Was ist denn Dein Ziel?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi Cheatah

      Was ist denn Dein Ziel?

      ich lese Messwerte von einem Solarexperimentierstation aus (Datenlogger) und möchte die aktuellen Messwerte (bekomme ich aus einer DB) als laufendes Diagramm im 5 Sekundentakt darstellen. Änlich wie die Kurse in der Börse ;)

      ralphi

      1. Hi,

        ich lese Messwerte von einem Solarexperimentierstation aus (Datenlogger) und möchte die aktuellen Messwerte (bekomme ich aus einer DB) als laufendes Diagramm im 5 Sekundentakt darstellen. Änlich wie die Kurse in der Börse ;)

        der Client soll die Daten alle 5 Sekunden aktiv abholen. Dies kann beispielsweise über AJAX geschehen.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
      2. Ich würde das mit AJAX machen. Eine JS-Funktion namens DiagrammRequest macht einen AJAX-Request. Das per AJAX aufgerufene Script schickt das Diagramm. In der callback-Funktion steht dann sowas:

        window.setTimeout(function () {DiagrammRequest(xml_status);},5000);

        Ansonsten: Was spricht gegen http-equiv="refresh"? Einziger Nachteil: die ganze Seite lädt erneut.

        Cheers,
        Baba

        1. @@Baba:

          nuqneH

          Ansonsten: Was spricht gegen http-equiv="refresh"? Einziger Nachteil: die ganze Seite lädt erneut.

          Ist das nicht Nachteil genug, wenn lediglich einige Daten aktualisiert werden sollen?

          Dafür braucht man nicht das ganze Markup erneut zu übertragen und die Seite neu zu rendern.

          Qapla'

          --
          Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
        2. hi baba,

          Ich würde das mit AJAX machen. Eine JS-Funktion namens DiagrammRequest macht einen AJAX-Request.

          Mit Java hab ichs nicht so.

          Ansonsten: Was spricht gegen http-equiv="refresh"? Einziger Nachteil: die ganze Seite lädt erneut.

          die idee war ein frameset, das die seite ruhiger wirkt. klappt derzeit auch nicht (ist wie verhext - kann nur das unter noframes im browser sehen).
          das php-diagramm  lässt sich nicht in html einbauen (es verträgt noch nicht mal echo und print befehle) und ein ext.php-prog in html aufzurufen, hab ich noch nicht gemacht!?

          im anhang das php-prog, so wie es eigenständig funktioniert und sich manuell (per klick) im browser aktualisieren lässt.

          ralphi

          <?php

          // Datenbank öffnen
          $link = mysql_connect ("192.168.123.1", "..", "..")
          or die ("keine Verbindung möglich: " .mysql_error());
          mysql_select_db ("solar");

          $data = mysql_query(sprintf("select * from akt1"));
          // array bilden
               $daten1 = array();
          $daten2 = array();
          $daten3 = array();
          $zeit = array();

          while ($row = mysql_fetch_array($data))
              {
                   $daten1[] = $row['wert1sec'];
          $daten2[] = $row['wert2sec'];
          $daten3[] = $row['wert3sec'];

          $zeit[] = $row['zeitsec'];  
          

          }

          include_once ('dlib/jpgraph.php');
          include_once ('dlib/jpgraph_line.php');

          // Setup the graph
          $graph = new Graph(600,230);
          $graph->SetScale("textlin");

          $theme_class= new UniversalTheme;
          $graph->SetTheme($theme_class);

          $graph->title->Set('Bernie-s Suncatcher I');
          $graph->SetBox(false);

          $graph->yaxis->HideZeroLabel();
          $graph->yaxis->HideLine(false);
          $graph->yaxis->HideTicks(false,false);
          $graph->xaxis->SetTickLabels($zeit);

          $graph->ygrid->SetFill(false);

          $p1 = new LinePlot($daten1);
          $graph->Add($p1);

          $p2 = new LinePlot($daten2);
          $graph->Add($p2);

          $p3 = new LinePlot($daten3);
          $graph->Add($p3);

          $p1->SetColor("#55bbdd");
          $p1->SetLegend('Modul 1');
          $p1->mark->SetType(MARK_FILLEDCIRCLE,'',1.0);
          $p1->mark->SetColor('#55bbdd');
          $p1->mark->SetFillColor('#55bbdd');
          $p1->SetCenter();

          $p2->SetColor("#333333");
          $p2->SetLegend('Modul 2');
          $p2->mark->SetType(MARK_UTRIANGLE,'',1.0);
          $p2->mark->SetColor('#333333');
          $p2->mark->SetFillColor('#aaaaaa');
          $p2->value->SetMargin(14);
          $p2->SetCenter();

          $p3->SetColor("#aaaaaa");
          $p3->SetLegend('Modul 3');
          $p3->mark->SetType(MARK_UTRIANGLE,'',1.0);
          $p3->mark->SetColor('#aaaaaa');
          $p3->mark->SetFillColor('#aaaaaa');
          $p3->SetCenter();

          $graph->legend->SetFrameWeight(1);
          $graph->legend->SetColor('#4E4E4E','#00A78A');
          $graph->legend->SetMarkAbsSize(32);

          // Output line
          $graph->Stroke();

          mysql_close ($link);
          ?>

          1. Mit Java hab ichs nicht so.

            Brauchst du auch nicht ;) Mit JavaScript dagegen sehr. Solltest Du vielleicht mal überlegen.

            die idee war ein frameset, das die seite ruhiger wirkt.

            Wenn Du wirklich framesets magst... Ich würde es nicht machen. Aber gut. Es ist eine Lösung.

            klappt derzeit auch nicht (ist wie verhext - kann nur das unter noframes im browser sehen).

            Unterstützt Dein Browser frames? Wie sieht Dein frameset aus? Onlinebeispiel!

            das php-diagramm lässt sich nicht in html einbauen (es verträgt noch nicht mal echo und print befehle) und ein ext.php-prog in html aufzurufen, hab ich noch nicht gemacht!?

            Also. Dein $Graph->Stroke() sieht so aus

            function Stroke($aStrokeFileName=''){  
              
              // (...)  
              
              $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName);  
              
            }
            

            Leider weiß ich nicht, was PutAndStream macht, da ich die Klasse der cache-Eigenschaft nicht finde (cache ist die Klasse ImgStreamCache(), die ich nicht finde). Also weiß ich nicht, was die direkt zurücksendet und mit welchem Header. Ich vermute mal, direkt das Bild. Mir fielen zwei Dinge ein:

            1. <img src="generate_graph.php"> wobei generate_graph.php dein geposteter code ist. Dieses img zeigts du dann im Frame an, den du refreshst.
            2. oder du versuchst mal was mit dem optionalem Parameter $aStrokeFileName und speicherst das Bild zunächst mal. Dann kannst Du es separat einbinden. Evtl auch mit der Methode, die Dir Tom beschrieben hat.

            Am einfachst wäre es, wenn Du mal ein Onlinebeispiel hättest. Und am schönsten wäre es für dich, wenn Du mal nach AJAX schaust. Ich mache soetwas ähnliches und nutze AJAX. Allerdings plotte ich die Graphen klientseitig, mit AmCharts. Der Vorteil: es sind interaktive Graphen.

            Cheers,
            Baba

            1. Ich packs nicht!!

              Mir fielen zwei Dinge ein:

              1. <img src="generate_graph.php"> wobei generate_graph.php dein geposteter code ist. Dieses img zeigts du dann im Frame an, den du refreshst.

              das hatte ich ganz am anfang schon ausprobiert!

              habs jetzt nochmal ausprobiert und merke einen tippfehler. funktioniert tadelos. - dank dir

              mühsam ernährt sich ..

              nur noch das problem mit dem frameset

              <body>
              <p>Geht nicht</p>
              <frameset framespacing="0" border="1"  frameborder="1" rows="65,335">

              <frame name="head" src="head.htm"  
              scrolling="no" marginheight="0" marginwidth="0" noresize target="head">  
              
              <frame name="akt1" src="aktsec.php"  
              scrolling="ok" marginheight="0" marginwidth="0" noresize target="akt1">  
              

              </frameset>
              </body>

              kommt nur 'geht nicht' unter frontpage-entwurf zeigt er die framebereiche an und die head.htm

              ich hab IE (neuester) unter W7

              ralphi

              1. nur noch das problem mit dem frameset

                Hm, lange nicht mit den Dingern gearbeitet :)
                Nimm auf jeden Fall mal das <p> ganz raus. Könnte sein, dass im Body nur das Frameset und der noframes Tag erlaubt ist.

                Ansonsten wären vielleicht noch http://de.selfhtml.org/html/frames/eingebettete.htm@title=iframes was für dich. Dann musst du die Dinger wenigstens nicht komplett verwenden.

                Cheers,
                Baba

                1. @@Baba:

                  nuqneH

                  Nimm auf jeden Fall mal das <p> ganz raus. Könnte sein, dass im Body nur das Frameset und der noframes Tag erlaubt ist.

                  „Elemente, die normalerweise im BODY-Element erscheinen würden, dürfen nicht vor dem ersten FRAMESET-Element stehen, sonst wird das FRAMESET ignoriert.“ [HTML401 §16.2]

                  Qapla'

                  --
                  Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
      3. Hello,

        ich lese Messwerte von einem Solarexperimentierstation aus (Datenlogger) und möchte die aktuellen Messwerte (bekomme ich aus einer DB) als laufendes Diagramm im 5 Sekundentakt darstellen. Änlich wie die Kurse in der Börse ;)

        Wenn Du nur ein Bild alle 5 Sekunden neu darstellen willst, geht das ganz normal mit JavaScript Dafür benötigst Du dann kein AJAX. Das Bild sollte nur immer dasselbe Format haben, wenn die Seite nicht wackeln soll. Alternativ in einem Elternelement mit festgelegten Maßen...

        Hier z.B. zum Einbinden eines Counters, der anzeigt, wieviele User in den letzten Minuten die Seite aufgerufen haben, also "quasi-online" sind.

        <script type="text/javascript">

        var pic_source = '/startbild.php';

        function counter_refresh(pic_src)
            {
                var pic = document.getElementById('img_counter');
                var jetzt = new Date();

        if(pic)
                {
                    pic.src = pic_source + '?time=' + jetzt.getTime();
                    window.setTimeout("counter_refresh(pic_source)",30000);
                }
            }

        </script>

        Und den Aufruf dann:

        <img id="img_counter" src="/visitcount.php" alt="counter">

        Die Grafik wird mit Hilfe der GD-Imagefunktionen immer on-the-fly erzeugt (GIF).

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. @@Tom:

          nuqneH

          Wenn Du nur ein Bild alle 5 Sekunden neu darstellen willst

          Will er das? Er will alle 5 Sekunden Daten neu darstellen.

          Und alle 5 Sekunden ein Bild zu übertragen, da kann von „nur“ eher keine Rede sein.

          Alle 5 Sekunden ein paar Byte für neue Daten zu übertragen, da schon.

          Das Erstellen des Diagramms aus den Daten sollte man vielleicht besser dem Client überlassen.

          Qapla'

          --
          Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
          1. Hello Gunnar,

            Wenn Du nur ein Bild alle 5 Sekunden neu darstellen willst

            Will er das? Er will alle 5 Sekunden Daten neu darstellen.
            Und alle 5 Sekunden ein Bild zu übertragen, da kann von „nur“ eher keine Rede sein.
            Alle 5 Sekunden ein paar Byte für neue Daten zu übertragen, da schon.
            Das Erstellen des Diagramms aus den Daten sollte man vielleicht besser dem Client überlassen.

            Du willst ihm ja nur erklären dürfen, wie das mit AJAX funktioniert ;-P

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
          2. Das ist doch Quatsch!
            Aus Performancegründen die Darstellung dem Client zu überlassen, wäre wohl ziemlich sinnlos bei der Generation einer Gif-Grafik. Der Lösungsansatz von Tom ist plausibel und einfach gehalten- perfekt.

            Gruß Hans

            1. @@Hans:

              nuqneH

              Das ist doch Quatsch!
              Aus Performancegründen die Darstellung dem Client zu überlassen, wäre wohl ziemlich sinnlos bei der Generation einer Gif-Grafik. Der Lösungsansatz von Tom ist plausibel und einfach gehalten- perfekt.

              Du meinst also, alle 5 Sekunden 100 Byte Daten übers Netz zu schicken sei Quatsch, alle 5 Sekunden(!) 10 oder 20 oder 50 Kilobyte GIF übers Netz zu schicken sei perfekt?

              Du machst den Quatsch perfekt.

              Qapla'

              --
              Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)