• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Serverseitige Timer

Lightstorm

New member
Hi,

ich wollte wissen wie es eigentlich möglich wäre auf einer Webseite einen Zähler einzubauen der runterzählt und dann eine programmierte Funktion auslöst.
Ich kenne solche Zähler von Browsergames wo z.B. die Fertigstellung eines neuen Gebäudes durch ein Timer angezeigt wird, z.B. 5min und wenn es runtergezählt hat wird entsprechende Ergebniss ausgeführt.

Der Zähler muss natürlich auch weiter laufen wenn der Besucher sich ausloggt bzw. die Seite verlässt.

Mit welcher Sprache geht so was am einfachsten/besten?
Ich lerne PHP, wäre daher gut wenn es damit ginge.

Wer Lust hat kann entsprechende Code Beispiele geben.
 
Hallo Lightstorm,

ein php-Skript (autom. gestartet durch einen cronjob) könnte in regelmässigen Abständen den Status des 'serverseitigen' Timers überprüfen und bei Bedarf die gewünschte Aktion auslösen.
 
Hallo Lightstorm,

ein php-Skript (autom. gestartet durch einen cronjob) könnte in regelmässigen Abständen den Status des 'serverseitigen' Timers überprüfen und bei Bedarf die gewünschte Aktion auslösen.
Geht das aber auch in Verbindung mit einer Anzeige des Timers der auf der Webseite Sekunde für Sekunde runterläuft?
 
Warum den Timer auf der Webseite nicht einfach mit JavaScript runterlaufen lassen und am Ende dann die entsprechende Aktion ausführen?
Serverseitig würde ich das ganze nichtmal unbedingt mit CronJobs machen, reicht doch, wenn es beim nächsten Aufruf der Seite im Hintergrund gemacht wird.
 
Es kommt halt darauf an, ob der Timer zukünftige Aktionen auslösen soll, wenn der User die Webseite bereits verlassen hat.
Zum Beispiel in vielen serverseitigen Echtzeit-Spielwelten ist das terminieren von Handlungen wichtig.
 
Ein CronJob wäre aber im Fall eines Spiels extrem Serverlastig und von daher nicht zu empfehlen. Aktionen lassen sich problemlos dann ausführen, wenn sie das nächste Mal aufgerufen wurden. Geht es zum Beispiel um das Ausbauen von Produktionsgebäuden, so lässt sich der Zeitpunkt der Produktionsveränderung problemlos im Nachhinein ausrechnen.
 
Der Timer soll nach Ablauf einfach einen Wert in der MySQL Datenbank ändern.

Warum den Timer auf der Webseite nicht einfach mit JavaScript runterlaufen lassen und am Ende dann die entsprechende Aktion ausführen?
Aber laufen JavaScript Anwendungen nicht nur auf dem Browser des Besuchers? Dann läuft der Timer doch nicht weiter wenn dieser die Seite verlässt oder?

Ein CronJob wäre aber im Fall eines Spiels extrem Serverlastig und von daher nicht zu empfehlen. Aktionen lassen sich problemlos dann ausführen, wenn sie das nächste Mal aufgerufen wurden. Geht es zum Beispiel um das Ausbauen von Produktionsgebäuden, so lässt sich der Zeitpunkt der Produktionsveränderung problemlos im Nachhinein ausrechnen.
Das heißt den Zeitpunkt speichern wann der Timer per JavaScript gestartet wurde, der Timer läuft auf der Seite per JavaScript, wenn der Besucher die Seite verlässt und später wieder besucht wird ausgerechnet wie viel Zeit vergangen ist und entsprechend einen kürzer gewordenen Timer laufen lassen bzw. die Aktion auslösen wenn der Timer durch ist. So etwa?

Aber dann würde die Wertänderung in der Datenbank durch den Timer erst geschehen wenn der Besucher zurück ist, das ist nicht optimal.

Eine Lösung wäre dann wohl auch ohne den Wideraufruf des Timers regelmäßig zu überprüfen ob der Timer durch ist.
 
Zuletzt bearbeitet:
Aber dann würde die Wertänderung in der Datenbank durch den Timer erst geschehen wenn der Besucher zurück ist, das ist nicht optimal.

Eine Lösung wäre dann wohl auch ohne den Wideraufruf des Timers regelmäßig zu überprüfen ob der Timer durch ist.
Der Server muss keinen Timer runterlaufen lassen, weil der Server exakt weiß, wann der jeweilige Timer fällig ist. Er kann das Zieldatum / -Uhrzeit schon beim Start ausrechnen.
Und Dein Einwand, dass er nur dann die gewünschte Aktion ausführt, wenn der Benutzer zurück ist, ist in so fern falsch, als dass es nicht dieser Benutzer sein muss, sondern abgelaufene Aktionen beim ersten Reload irgendeines Benutzers erfolgen kann. Dann wenn kein Benutzer einen Reload macht, bzw. keine neue Seite anfordert, dann sieht auch keiner, dass die Aktion(en) noch gar nicht ausgeführt wurde(n).

Es ist also alles eine Frage der Sichtweise.
 
@Albu
Der Server muss keinen Timer runterlaufen lassen, weil der Server exakt weiß, wann der jeweilige Timer fällig ist. Er kann das Zieldatum / -Uhrzeit schon beim Start ausrechnen.
Du meinst der Server merkt sich in einer Datenbank welche Aktion wann erfolgen muss.
Aber wäre dafür nicht eine Schleife nötig der ständig die Datenbank durchgeht um zu schauen ob gerade eine Aktion ausgelöst werden muss?
Indem es die aktuelle Uhrzeit mit den gespeicherten Zieluhrzeiten in der Datenbank vergleicht.
Und Dein Einwand, dass er nur dann die gewünschte Aktion ausführt, wenn der Benutzer zurück ist, ist in so fern falsch, als dass es nicht dieser Benutzer sein muss, sondern abgelaufene Aktionen beim ersten Reload irgendeines Benutzers erfolgen kann. Dann wenn kein Benutzer einen Reload macht, bzw. keine neue Seite anfordert, dann sieht auch keiner, dass die Aktion(en) noch gar nicht ausgeführt wurde(n).
Das verstehe ich leider nicht genau.
Ich habe mir das so vorgestellt das z.B. nach Ablauf des Timers sagen wir ein Gebäudelevel um ein Wert erhöt wird in der Datenbank.

Das muss rechtzeitig geschehen auch wenn der Spieler nicht online ist, weil es kann ja sein das durch ein Angriff eines anderen Spielers die Gebäudelevel eine Rolle spielen, dann müssten bereits die Veränderungen aktuell sein in der Datenbank.

Verstehe nicht wie andere Benutzer die Aktionen für Gebäudeausbau bei einem anderen Spieler auslösen können.
 
Zuletzt bearbeitet:
@Albu

Du meinst der Server merkt sich in einer Datenbank welche Aktion wann erfolgen muss.
Aber wäre dafür nicht eine Schleife nötig der ständig die Datenbank durchgeht um zu schauen ob gerade eine Aktion ausgelöst werden muss?
Indem es die aktuelle Uhrzeit mit den gespeicherten Zieluhrzeiten in der Datenbank vergleicht.
Nein, ein ständiges Abfragen wird nicht benötigt, es würde einfach bei jedem Abfragen der Datenbank nachgeschaut, welche Aktionen ausgeführt werden müssen.

Das verstehe ich leider nicht genau.
Ich habe mir das so vorgestellt das z.B. nach Ablauf des Timers sagen wir ein Gebäudelevel um ein Wert erhöt wird in der Datenbank.

Das muss rechtzeitig geschehen auch wenn der Spieler nicht online ist, weil es kann ja sein das durch ein Angriff eines anderen Spielers die Gebäudelevel eine Rolle spielen, dann müssten bereits die Veränderungen aktuell sein in der Datenbank.

Verstehe daher nicht wie andere Benutzer die Aktionen für Gebäudeausbau bei einem anderen Spieler auslösen können. Hm.

Nehmen wir mal dieses Beispiel eines Gebäudes. Der Gebäude-Ausbau muss entweder beim Blick auf das Gebäude-Bau Menü oder bei einem Angriff auf die Burg/Dorf/Planet/Stadt ausgeführt werden. Also fragst du die Datenbank bei jedem Angriff auf die Burg und bei jedem Blick auf das Gebäude-Menü ab, ob irgendwelche Gebäude fertigausgebaut sind (der Timer also quasi abgelaufen wäre) und führst die Aktion dann aus. So ist gewährleistet, dass die Ausbauten rechtzeitig für die benötigten Aktionen ausgebaut sind.
 
Aso, jetzt verstehe ich es.

Wie wird aber dem Besucher eigentlich ein verkürzter Timer angezeigt.
z.B. er startet den Gebäudeausbau das 10min dauert und er geht raus und kommt nach 5min wieder online, dann müsste er einen Timer von 5min ablaufen sehen, die Zeit die noch übrig geblieben ist.

Der Server rechnet schon das Zieldatum aus und trägt es in die Datenbank ein, und der Timer mit sek, min. und std. Anzeige läuft ja über JavaScript im Browser.
Wie kann man den Timerablauf erhalten wenn der Besucher die Seite kurz verlässt und wieder zurück kommt?
 
Kannst doch mit PHP einfach ausrechnen, wieviel Zeit noch zwischen dem Ereignis und dem jetzigen Zeitpunkt sind und das ganze an JavaScript übergeben.
 
Hm wenn das geht alles klar.
Danke für die Aufklärung :)
Habe jetzt eine genauere Vorstellung wie das zu machen ist.
Ich brauche das momentan einfach zum lernen, will kleine Sachen programmieren zum rumtesten und lernen.
 
Zurück
Oben