Countdown - nicht über Clientzeit

Es geht aber auch ohne Ajax - und zwar genau so, wie es Hardy (warscheinlich) auch gemeint hat:
Code:
var srvTS = xxx;	// Timestamp des Servers
var srvLogoutTS = xxx;	// Timestamp des Servers, der die gewünschte Logout-Zeit repräsentiert

function doCount() {
	document.getElementById("countdown").innerHTML = srvLogoutTS - ++srvTS;
	setTimeout('doCount()', 1000);
}
setTimeout('doCount()', 1000);

Ajax hat den großen Nachteil des ständig anfallenden Traffics!

Gruß
 
traffic ist kein problem da wir uns in einem getrennten LAN befinden...
schaue mir aber deinen lösungsansatz mal genauer an - danke!
 
Ajax hat den großen Nachteil des ständig anfallenden Traffics!

Naja, ne einfache Rückgabe von plain Text '09:23:48' produziert nicht zuviel traffic ;)

Ansonsten hat die Lösung auch was, ist nur die frage, wie ungenau die nach einer Stunde Laufzeit wird? Kann es eine Verschiebung des setTimeout() bei hoher CPU-Auslastung am Client geben, oder ist die Milisekunde zugesichert?

Mich würde das wirklich interessieren, ist keine rethorische Frage.

Dirk
 
Hi!

Ich kann mir nicht vorstellen, dass es da merkbare Abweichungen gibt - auch wenn ich mir jetzt nicht die tatsächliche Technik, die hinter diesem Befehl steckt, angesehen habe.

Zurück zur Ajax-Lösung:
Viel Traffic wird nicht erzeugt, allerdings wird der Server auch nicht performanter, wenn jede Sekunde 2000 (übertrieben) Clients einen HTTP-Request stellen und eine Antwort erwarten! Ist ja schon fast ein DoS-Angriff ;)

Die Übermittlung des Timestamps kostet auch Zeit, und je mehr Clients diesen gleichzeitig anfordern desto länger dauert die Übertragung und desto ungenauer ist die Zeit!

Außerdem leidet unter den ständigen Request auch die Performance des Clients.


Gruß
 
Viel Traffic wird nicht erzeugt, allerdings wird der Server auch nicht performanter, wenn jede Sekunde 2000 (übertrieben) Clients einen HTTP-Request stellen und eine Antwort erwarten! Ist ja schon fast ein DoS-Angriff ;)

Naja,. jede Sekunde würde ich das dann auch nicht abfragen - nach 10 Minuten und dann das ganze gegen die client-side time testen .. wer manipuliert fliegt direkt raus ..

Also ich sehe das traffic-Problem, allerding finde ich den Abgleich gegen dern Server immer noch die bessere Lösung als pure JS, einfach weil man dann eben die Kontrolle hat, am Client ist am Client ....

Egal - ich denke ich hab dich verstanden und wie gesagt, ich finde die pure JS Lösung auch ganz gut - lassen wir es dabei ;)

Dirk
 
Die Kontrolle findet sowieso serverseitig statt - siehe Eröffnungspost! Es geht hier ausschließlich um die Anzeige eines Countdowns.

Wie wäre es mit einer Hybrid-Lösung? ;)

Mein Code + 10-minütiger Aktualisierung des Timestamps :)
Nein, aber wie gesagt - ich glaube nicht, dass es irgendwelche Abweichungen mit setTimeout() gibt. Und wenn befinden sich diese im niedrigen ms-Bereich.
 
Hier die fertige Lösung - PHP + JS
.


Code:
<script type='text/javascript'>
<!--
	var srvTS = <?php echo time(); ?>;	// Timestamp des Servers
	var srvLogoutTS = <?php echo time()+1000; ?>;	// Timestamp des Servers, der die gewünschte Logout-Zeit repräsentiert

		document.write('<div style="text-align: center">');
		document.write('	<span id="countdown">Time´s up</span><br />');
		document.write('</div>');

	function toTime(n) {
		 s = "";
		 if (n < 10) s += "0";
		 return (s + n).toString();
	}

	function doCount() {
		count = srvLogoutTS -++srvTS;
		seconds = toTime(count%60); count = Math.floor(count/60);
		minutes = toTime(count%60); count = Math.floor(count/60);
		hours = toTime(count%24); count = Math.floor(count/24);
		days = count;
		document.getElementById("countdown").innerHTML = hours + ' Stunden ' + minutes + ' Minuten ' + seconds + ' Sekunden.';
		setTimeout('doCount()', 1000);
	}
setTimeout('doCount()', 50);
//-->
</script>
 
Du weißt aber schon, dass in der Variablen srvLogoutTS der Timestamp, der die Logout-Zeit repräsentiert rein muss? (d.h. $login_time_stamp + $sitzungsdauer_in_sekunden). Wenn du den LogoutTS aus der aktuellen Serverzeit + gewünschte Sitzungsdauer generierst (das ist jetzt der Fall), so wird der Countdown bei einem Seitenreload wieder von vorne starten.

Nochmal auf deutsch: Speicher beim Login den Server-Timestamp in deiner Session und änder dein Script etwas ab:
Code:
<script type='text/javascript'>
<!--
	var srvTS = <?php echo time(); ?>;	// Timestamp des Servers
	var srvLogoutTS = <?php echo $_SESSION["login_timestamp"]; ?>;	// Timestamp des Servers, der die gewünschte Logout-Zeit repräsentiert

		document.write('<div style="text-align: center">');
		document.write('	<span id="countdown">Time´s up</span><br />');
		document.write('</div>');

	function toTime(n) {
		 s = "";
		 if (n < 10) s += "0";
		 return (s + n).toString();
	}

	function doCount() {
		count = srvLogoutTS -++srvTS;
		seconds = toTime(count%60); count = Math.floor(count/60);
		minutes = toTime(count%60); count = Math.floor(count/60);
		hours = toTime(count%24); count = Math.floor(count/24);
		days = count;
		document.getElementById("countdown").innerHTML = hours + ' Stunden ' + minutes + ' Minuten ' + seconds + ' Sekunden.';
		setTimeout('doCount()', 1000);
	}

// Eigentlich solltest du den Timer auf 1000 setzen (nicht auf 50), weil der erste Countdown erst nach einer Sekunde
// aufgerufen werden soll. Beachtet man allerdings, dass die Übertragung auch seine Zeit dauert, kann man das so
// stehen lassen...
setTimeout('doCount()', 50);
//-->
</script>
Wichtige Stellen sind markiert...
 
Zuletzt bearbeitet:
oder vielleicht so .. :)
Code:
<script type='text/javascript'>
<!--
	var srvTS = <?php echo time(); ?>;	// Timestamp des Servers
	var srvLogoutTS = <?= $_SESSION["log_doneTime"]; ?>;

....
//-->
</script>
 
Du weißt aber schon, dass in der Variablen srvLogoutTS der Timestamp, der die Logout-Zeit repräsentiert rein muss? (d.h. $login_time_stamp + $sitzungsdauer_in_sekunden).
// Eigentlich solltest du den Timer auf 1000 setzen (nicht auf 50), weil der erste Countdown erst nach einer Sekunde
// aufgerufen werden soll. Beachtet man allerdings, dass die Übertragung auch seine Zeit dauert, kann man das so
// stehen lassen...

Code:
setTimeout('doCount()', 50);
//-->
</script>
Wichtige Stellen sind markiert...

ja - ist mir schon klar *lachen muss*, aber für "demo-zwecke" reicht das und für die vielen JS anfänger die hier rumrennen reicht das auch zum testen, damit sie wenigstens "ansatzweise" verstehen was da passiert :D

was den unteren timer angeht haste recht...*zu schnell copy&pase gm8 - ohne groß kommentiert zu haben* :)


EDIT:
und damit das ganze nicht ins "minus" rennen kann einfach noch:
Code:
	function doCount() {
		count = srvLogoutTS -++srvTS;
                if (count > -1) {
		seconds = toTime(count%60); count = Math.floor(count/60);
		minutes = toTime(count%60); count = Math.floor(count/60);
		hours = toTime(count%24); count = Math.floor(count/24);
		days = count;
		document.getElementById("countdown").innerHTML = hours + ' Stunden ' + minutes + ' Minuten ' + seconds + ' Sekunden.';
		setTimeout('doCount()', 1000);
               }
	}

...setzen
 
Zuletzt bearbeitet:
Zurück