melko: Serverzeit jede Minute holen ohne refresh??!

HallO!

Habe folgende Problemstellung: ich muss für eine Seite eine Art Liveticker machen, dh: ich brauche eine Uhrzeit die sich jeweils um eine Minute nach vor bewegt, jedoch bei allen Clients gleich sein soll...

Nun da ich aber nicht jede Minute einen refresh machen will habe ich folgendes gemacht:

So bekomme ich die Zeit vom Server:

<?php

echo "<script language=JavaScript>";

$datum = date('M, d Y H:i:s'
    ,mktime( date('H'),date('i'),date('s'),date('m'),date('d'),date('Y') ) );

echo 'var serverTime = new Date( "'.$datum.'");';
echo 'var start = new Date( "'.$datum.'");';
echo "</script>";

und auf folgende Weise lasse ich die Uhr beim Clien laufen:

function runTime(){
serverTime.setSeconds(serverTime.getSeconds()+1);
window.setTimeout('runTime()',1000);
}
window.setTimeout('runTime()',1000);

Nur ich bekomme dann nach einer Stunde einen Zeitunterschied von ca. 50 Sekunden!?? kann ich den irgendwie minimieren??
Oder gibt es vielleicht irgendeine andere Art wie ich Serverzeit bekomme ohne die Seite jedes Mal komplett refreshen zu müssen!?

DANKE für Eure Hilfe.

Gruß melko

  1. Hallo melko,

    und auf folgende Weise lasse ich die Uhr beim Clien laufen:

    function runTime(){
    serverTime.setSeconds(serverTime.getSeconds()+1);
    window.setTimeout('runTime()',1000);
    }
    window.setTimeout('runTime()',1000);

    Nur ich bekomme dann nach einer Stunde einen Zeitunterschied von ca. 50 Sekunden!?? kann ich den irgendwie minimieren??
    Oder gibt es vielleicht irgendeine andere Art wie ich Serverzeit bekomme ohne die Seite jedes Mal komplett refreshen zu müssen!?

    Du lässt immer nach 1000 Millisekunden ein Skript laufen, dass etwas bestimmtes macht.
    Ergo hier die Zeiten:

    1. 1000 ms Warten
    2. Aktion durchführen
    3. erneut 1000 ms warten
    4. [...]

    Wenn du die Funktion serverTime.setSeconds() aufrufst ("Aktion durchführen"), so kostet das ein paar Millisekunden. Auf unterschiedlich schnellen und unterschiedlich belasteten Rechnern sind das mal ein paar Millisekunden mehr oder weniger, auf jeden Fall aber mehr als die Serverzeit.

    Du suchst die JavaSript-Funktion setInterval(), die du _ein Mal_ zu Beginn aufrufst und die dann alle 1000 Millisekunden deine Aktion durchführt - parallel zur Zeit, d.h. die Aktion wird durchgeführt während bereits die nächsten 1000 ms Laufen.

    Eventuell könntest du ja einen Zähler einbauen, der nach 3600 Sekunden oder so die Seite neu vom Server lädt - und so wieder die aktuelle Uhrzeit genommen wird.

    Bis dann!

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    http://emmanuel.dammerer.at/selfcode.html
    1. OK erstmal danke für eure Antworten... werde mir das mit setInterval() anschauen... Vielleicht kann ich dadurch die Verzögerung verringern... mal sehen... und vielleicht noch extra ein Interval einbauen dass die Zeit jede halbe Stunde vom Server holt... das wäre vielleicht nicht schlecht... DANKE für euren Idee...

      Gruß melko

  2. hi,

    Nur ich bekomme dann nach einer Stunde einen Zeitunterschied von ca. 50 Sekunden!??

    vermutung:
    da die funktion, die du per timeout sich immer wieder selbst aufrufen lässt, ja auch zeit braucht, ergeben die 1000 millisekunden eben nicht immer einen neuen aufruf nach _exakt_ einer sekunde.

    kann ich den irgendwie minimieren??

    auf window.setInterval() umzusteigen könnte(!) zumindest bewirken, dass keine verzögerung durch die laufzeit der funktion mehr reinkommt.

    Oder gibt es vielleicht irgendeine andere Art wie ich Serverzeit bekomme ohne die Seite jedes Mal komplett refreshen zu müssen!?

    vielleicht nur alle x minuten einen refresh machen (per meta-tag) - um so die aufsummierung der eher unerheblichen kleineren abweichungen zu einer großen, signifikanten zu verhindern?

    btw: dass der request an den server und der response auch ihre zeit brauchen, und somit das ergebnis "verfälschen", hast du hoffentlich - wenn du so großen wert auf genauigkeit legst - schon bedacht.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  3. HallO!

    Habe folgende Problemstellung: ich muss für eine Seite eine Art Liveticker machen, dh: ich brauche eine Uhrzeit die sich jeweils um eine Minute nach vor bewegt, jedoch bei allen Clients gleich sein soll...

    Ich denke, das ist ein berechtigter Fall für ein <iframe>.

    Du machst eine HTML- Seite, auf der nur die Server-Zeit angezeigt wird. Und diese macht einen refresh pro Minute (oder so genau, wie du es brauchst).

    Jetzt diese Seite in einen <iframe> einbauen, und der refresh bezieht sich nur auf die Uhrzeit.

    Habe ich nicht getestet, musst du mal probieren. Riesenvorteil: Kein JavaScript.

    Und wenn jemand die Seite gerade um 11:50:44 Sekunden aufruft, ist der erste refresh halt schon nach 16 Sekunden. Stelle die refresh- Zeit serverseitig immer auf die nächste volle Minute.

    LG Kalle

    1. Hallo Kalle_,

      Ich denke, das ist ein berechtigter Fall für ein <iframe>.

      Du machst eine HTML- Seite, auf der nur die Server-Zeit angezeigt wird. Und diese macht einen refresh pro Minute (oder so genau, wie du es brauchst).

      Waah - das ist ein absolut schlechter Gedanke.
      Erstens wegen dem IFrame, zweitens wegen dem entstehenden Traffic.
      Im Übrigen gibt es keine berechtigten Anwendungsfälle für ein IFrame, zumindest sind mir bis jetzt keine begegnet. Anwendungsfälle habe ich schon viele gesehen, aber berechtigt waren sie nicht.

      Wieso leicht, wenn es auch umständlich geht?

      Bis dann!

      Marc Reichelt || http://www.marcreichelt.de/

      --
      Linux is like a wigwam - no windows, no gates and an Apache inside!
      Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
      http://emmanuel.dammerer.at/selfcode.html
      1. Hi,

        Im Übrigen gibt es keine berechtigten Anwendungsfälle für ein IFrame, zumindest sind mir bis jetzt keine begegnet. Anwendungsfälle habe ich schon viele gesehen, aber berechtigt waren sie nicht.

        Also ich hab eine.
        In meinem Redaktionssystem (PHP) besteht die Möglichkeit, Plugins einzubinden, die auch in PERL realisiert sein können.

        In einem IFrame wird also nur die Ausgabe von diesen PERL-Scripten angezeigt. Ansonsten müsste ich die Ausgabe irgendwie übe PHP parsen und die Seite neu laden. Da IFrames von modernen Browsern unterstützt werden, und ein Pageadmin im "Normalfall" einen modernen Browser benützt, ist es auch durchaus sinnvoll ein solches Feature zu nutzen.

        Alternative wäre ein Popup gewesen, was IMO aber sehr hässlich ist.

        1. Hi Manuel,

          In meinem Redaktionssystem (PHP) (...)

          Für einen kleineren Bereich, auf den nur ein eingeschränkter Personenkreis Zugriff hat, stimme ich dir zu - wenn es jedoch um einen frei zugänglichen Bereich und im relevante Informationen geht, dann wäre es doch besser, die Ausgabe des Perl Scriptes einzulesen und wieder auszugeben.

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Dies hier ist ein öffentliches Forum - wer dir hier geholfen hat, hat dies vollkommen freiwillig und unter Aufopferung seiner Freizeit getan!
          1. Hi,

            wenn es jedoch um einen frei zugänglichen Bereich und im relevante Informationen geht, dann wäre es doch besser, die Ausgabe des Perl Scriptes einzulesen und wieder auszugeben.

            Da geb ich dir vollkommen recht. Denn einen Admin deinen Brfowser" vorzuschreiben geht grad noch, immerhin entscheidet er sich rfür den Einsatz dieser Software. Aber dem Besucher sollte man immer noch die Wahl lassen.
            Ich nutze IFrames auch nur für diesen einen speziellen Fall. :)

  4. Hi,

    Habe folgende Problemstellung: ich muss für eine Seite eine Art Liveticker machen, dh: ich brauche eine Uhrzeit die sich jeweils um eine Minute nach vor bewegt, jedoch bei allen Clients gleich sein soll...

    Also ich würde das so lösen:

    Wie bisher ein Javascript-Date-Objekt mit der Serverzeit erzeugen.
    Außerdem ein Javascript-Date-Objekt mit der aktuellen Client-Zeit erzeugen lassen (new Date() ohne Parameter).

    Aus beiden kannst Du jetzt einmalig die Differenz ermitteln (getTime() für beide und daraus die Differenz).
    Die Differenz zeigt die Abweichung der beiden Uhren.

    Alle Sekunde (oder wie oft auch immer) holst Du dann wieder die aktuelle Client-Zeit, addierst die einmalig ermittelte Differenz drauf und verarbeitest das Ergebnis.

    Bei dieser Methode ist es egal, wie genau die Aufruf-Intervalle sind - nur noch die Ganggenauigkeit der Client-Uhr erzeugt Fehler (die dürften aber vernachlässigbar sein).

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.