mmofacts.com

Remote Cronjobs

gepostet vor 19 Jahre, 8 Monate von cem0r
Ahoy,
folgendes: Hab die letzten paar Tage mal ein BG zusammengeschustert. Im Grunde auch fertig, läuft alles prima (augenscheinlich jedenfalls) und ist bereit für den ersten Testlauf in freier Wildbahn.

Das Problem ist nur: Ich habe einen Shared-Server (bei HE) und habe keine Möglichkeit Cronjobs einzurichten (welche ja für die meisten Browsergames - und auch für meins - grundlegend sind).

Natürlich war ich mir über das Problem schon im Vorfeld bewusst und machte mich auf die Suche nach einem kostenlosen Remote-Cronjob anbieter. Ich wurde auch schnell hier fündig. Allerdings hätte ich mir die ganze Sache etwas genauer ansehen sollen, denn ich kann täglich lediglich 1 Cronjob ausführen lassen. Das sind genau 143 zu wenig.

Alle anderen Anbieter die ich finde sind entweder nicht kostenlos oder haben zu weite Intervalle, deswegen: Kennt ihr einen Remote-Cronjob Anbieter mit einer Intervalle die es mir ermöglicht, alle 10 Minuten einen Cronjob zu starten?

Ich bedanke mich im Vorfeld für die Antworten.
gepostet vor 19 Jahre, 8 Monate von None
Ich habs zwar noch nicht probiert aber schau dir mal http://www.cronjob.de/ an. Keine Ahnung, hab den Link nur irgendwann mal gefunden...
gepostet vor 19 Jahre, 8 Monate von [DL]Don
Ich finde, Remote Cronjobs sind nicht so empfehlenswert.
Habe die selbst früher genutzt und nich so gute Erfahrungen damit gemacht. Wenn der Server ausgelastet oder von außen nicht erreichbar ist (Connection Timeout etc.), werden die Cronjobs nicht (vollständig) ausgeführt.
gepostet vor 19 Jahre, 8 Monate von cem0r
Danke für die Antworten!

Was den Timeout angeht: Ich habe von einem Freund den Tipp bekommen, den eigentlichem Gametick in einer Funktion zu schreiben, die beim beenden des Scripts aufgerufen wird (register_shutdown_function()) damit das Connection Timeout Problem nicht auftritt.
gepostet vor 19 Jahre, 8 Monate von Krisch
hmm wie funktioniert das dann? Versucht es die Funktion solange weiter bis es geht ohne die Skriptbeschränkung (i.d.R 30 Sekunden) zu beachten?
gepostet vor 19 Jahre, 8 Monate von cem0r
Original von Krisch
hmm wie funktioniert das dann? Versucht es die Funktion solange weiter bis es geht ohne die Skriptbeschränkung (i.d.R 30 Sekunden) zu beachten?

Die Funktion die mit register_shutdown_function registriert wurde, wird beim beenden des Scripts aufgerufen. Mit andern Worten: Man übergibt dem Remote Cronjob eine Ausgabe, stellt selbigen damit zufrieden, die Verbindung wird beendet abe das Script führt die Funktion trotzdem aus. Die maximale Ausführungszeit muss man höchstwahrscheinlich manuell erhöhen.
gepostet vor 19 Jahre, 8 Monate von Krisch
Okay, Danke. Ich denke ich habe es verstanden.
gepostet vor 19 Jahre, 8 Monate von Gambler
Wie du vl gelesen hast biete ich Hosting für 2 BGs an.
Daher kann ich dir auch wenn du möchtest Remote Cronjobs machen die dann bei dir aufm Server was ausführn. Bei interesse: [email protected]
Morgen bin ich allerdings erst Abends erreichbar (ja es gibt so arme Leute die am WE zur Arbeit genötigt werden)
gepostet vor 19 Jahre, 6 Monate von Sellfisch
Mit ein bischen Mühe kannst du bei der Programmierung doch vollständig auf Cronjobs verzichten. Is vor allem ganz Praktisch wenn du es al Netzwerkversion noch mal anbietest
gepostet vor 19 Jahre, 5 Monate von Freshman
ich habe zb. ganz auf Chronjobs verzichtet, und mache alles im spiel
selber, resssourcen zb. können bis zu alle 60 sekunden aktualisiert werden, wenn der Spieler immer da ist...

allerdings weiß ich nicht, ob das mit php etwas zu aufwendig ist, und
zu viel Speicher frisst...
gepostet vor 19 Jahre, 5 Monate von Kallisti
Original von Freshman
ich habe zb. ganz auf Chronjobs verzichtet, und mache alles im spiel
selber, resssourcen zb. können bis zu alle 60 sekunden aktualisiert werden, wenn der Spieler immer da ist...

allerdings weiß ich nicht, ob das mit php etwas zu aufwendig ist, und
zu viel Speicher frisst...


Das Problem bei der Variante ist 1. dass zu Hochzeiten (abends gegen 19 Uhr, Sonntags etc.) die Last richtig richtig hoch ist, während sich das mit regelmäßigen Abarbeitungen verteilt und 2. dass es weit aufwendiger ist Code an zig Stellen zu warten, anstatt nur an einer zentralen.
gepostet vor 19 Jahre, 5 Monate von Freshman
Die rechenzeiten geht hoch, ist klar, aber mein gott, ist alles c++,
den jucken die par rechnungen nicht.

wer in php arbeitet, sollte das ganz klar als chrojob laufen lassen, das
ist klar..


ps.: das mit dem code an zig stellen kommt so nicht hin.
für die ressorucen, und alles anderen berechnungen gibt es eine Klasse,
und nicht überall codeschnipsel.

es steht alles in einer datei, ganz genau getrennt und sortiert.
gepostet vor 19 Jahre, 5 Monate von AlphaWolf
Warum ist das mit PHP zu Rechenlastig?:

Man speichert bei jedem Seitenaufruf den aktuellen Timestamp. Beim nächsten aufruf wird der einfach mit dem aktuellen verglichen und die Ressourcen verteilt. Was ist daran hardwarefressend?
gepostet vor 19 Jahre, 5 Monate von Kallisti
Original von AlphaWolf
Warum ist das mit PHP zu Rechenlastig?:

Man speichert bei jedem Seitenaufruf den aktuellen Timestamp. Beim nächsten aufruf wird der einfach mit dem aktuellen verglichen und die Ressourcen verteilt. Was ist daran hardwarefressend?


Je nach Spielkonzept musst du auch Ressourcen von angegriffenen, ausspionierten etcetc. Basen updaten...

Das summiert sich alles auf, und zwar genau zu peakzeiten, wenn alle online sind.
gepostet vor 19 Jahre, 5 Monate von AlphaWolf
Die Ressourcen werden ja bei der Berechnung direkt in die Datenbank geschrieben. Bei ausspionierten etc. werden die dann direkt von dort genommen. Jeder User berechnet die Ressourcen für sich selbst und speichert sie wo sie von den anderen ausgelesen werden.

Soweit bin ich allerdings noch nicht. So stehts allerdings in meinem Konzept. Irgendwie schaukel ich das schon :lol:
gepostet vor 19 Jahre, 5 Monate von Lalabimbam
@ alphawolf:
Wenn du die Rohstoffe vom letzten Login des Spielers ( A ) und ein Spieler ( B ) sondet ihn nach einer gewissen zeit sieht der also nur die Rohstoffe die da wahre wie A eingelogt war.
Schon überlegt wie du das in einem Fall von einem Kampf machst?
Was ist wenn A schon 2 flugis fertig gerbaut hat aber noch nicht eingelogt war und B denn dann angreift.
Dann würden in dem kampf dann die 2 Flieger von A nicht auftauchen. Genauso nimmt B nicht alle Rohstoffe mit weil es ja aus der DB genommen wird.
Das ist eine einfache Art Fleet zu saven und Rohstoffe zu Sammeln... ich loge mich einfach eine Zeit nicht ein und lass Flieger in der Schleife.
Ist glaub ich nicht ganz im Sinne des Erfinders.
gepostet vor 19 Jahre, 5 Monate von AlphaWolf
Da hast du Recht. Das heißt ich müsste bei jedem Zugriff die Zeit miteinberechnen.

Wie löst ihr das denn genau mit Cronjobs?
gepostet vor 19 Jahre, 5 Monate von Kallisti
Ein Cronjob würde zum beispiel alle 10 Minuten die Ressourcen für alle Spieler verteilen..

Oder alle fertigen Schiffe in die Häfen stellen etc...

Statt über Cronjob, kann man das allerdings eleganter mit eigener Serversoftware machen...
gepostet vor 19 Jahre, 5 Monate von AlphaWolf
Wäre auch ne Lösung. Über Java kommt man ja gut an die Datenbank ran. Nur da brauche ich einen Rootie Da müssen dann erstmal Crons herhalten.

Hab bei meinem Provider 20 Crons dann sollte reichen. Lokal muss ich die halt zum testen selbst aufrufen.
gepostet vor 19 Jahre, 5 Monate von Kallisti
Original von AlphaWolf

Hab bei meinem Provider 20 Crons dann sollte reichen. Lokal muss ich die halt zum testen selbst aufrufen.


Oder ein vernünftiges OS benutzen...
Ansonsten gäb es da so was wie nen "Task Manager" glaub ich.

Um nen rootserver kommst du auf lange Zeit eh nicht herum...
gepostet vor 19 Jahre, 5 Monate von TheUndeadable
Das Ding nennt sich Task-Planer. Bin zwar nen Fan von Windows, aber das Ding ist nen grauenhaftes etwas!

Lieber würde ich in C# nen 3-Zeiler schreiben, als dieses etwas zu nutzen!
Wenn Bedarf besteht, kann ich so ein kleines Programm, was alle X-Sekunden ne Datei aufruft oder nen HTTP-Request startet, schreiben und freigeben. Allerdings nur als GUI, nicht als Dienst, für letzteres bin ich zu faul.
gepostet vor 19 Jahre, 5 Monate von AlphaWolf
Hmm ich mach es lieber selbst. Kann ja etwas Java und wie ich mich kenne belästige ich dich dann nur mit Extra Wünschen :lol:
gepostet vor 19 Jahre, 5 Monate von AlphaWolf
Ich noch mal:

Die Ressourcen lasse ich jetzt unabhängig von den Seitenaufrufen nur in einem bestimmten Intervall (mal gucken welchen) vergeben(Cron). Die Crons schauen aber trotzdem nach, wann das letzte Update war und rechnen anhand dessen die Resis aus und speichern sie als double in die db. Werden halt nur als ganze Zahl gerundet ausgegeben. Ich könnte ja auch drauf vertrauen, dass das Teil immer alle 5min aufgerufen wird und dann res / h * 5 rechnen, aber die Crons haben ja schonmal gern Verspätung :lol:

Bei Einheiten / Gebäuden ist die Genauigkeit ja noch wichtiger, weil ich ja einen Countdown anzeigen will. Bei den Gebäuden/Einheiten hatte ich mir also überlegt bei jedem Aufruf die eigenen Gebäude/Einheiten(auf allen Basen etc.) auf fertige Sachen zu überprüfen. Natürlich wird das auch noch mit einem Cron abgesichert. Wie seht ihr das?
gepostet vor 19 Jahre, 5 Monate von Kallisti
Naja, wenn zB eine Mine fertig wird, muss sie ja dann auch schon produzieren... etc.etc. hängt von deinem Spielkonzept ab, aber du musst jede Kreuzwirkung zwischen zwei Vorgängen berücksichtigen, wenn du das ganze ohne Serversoftware oder jede Menge Cron durchziehen möchtest.
gepostet vor 19 Jahre, 5 Monate von The_Alien
Oder man pfeift einfach auf die paar Ress zwischen fertigstellung und nächstem login des Users. Auffallen tut das meistens eh keinem da es eh nicht so viel ist.

Ich berechne die Res wenn sich ein User einloggt, dann werden alle gebäude etc aktualesiert und danach erst mit den neuen Minen gerechnet.

Ich muß aber dazu sagen das das Spiel in PHP und bisher ohne Cronjob läuft.

Allerdings bin ich es so am umbauen das ein User immer eine gewisse anzahl Threads von anderen Usern mit akualesiert (wer das nun macht ist ja an und für sich egal - irgendwer muß es ja machen).

So kommen dann auch Flüge an wan sie ankommen sollen und auch Minen sind "halbwegs" pünktlich gebaut.

Wenn man das aber nicht von Anfang an einplant ist es sehr viel arbeit das nachträglich zu machen.
gepostet vor 19 Jahre, 5 Monate von Balduran
Ich könnte ja auch drauf vertrauen, dass das Teil immer alle 5min aufgerufen wird und dann res / h * 5 rechnen, aber die Crons haben ja schonmal gern Verspätung


Ich hab des so geregelt das ich ne kleine tabelle inner Datenbank habe / kannst auch ne datei nehmen / wo des letzte game-update als timestamp gespeichert wird.. dann liest er den timestamp und berechnet den Zeitabstand zwischen dem jetzigen timestamp und dem gespeicherten und rechnet damit der gewonnenen ressourcen und alles aus

----


ich hatte des früher so das bei jedem Seitenaufruf alles geupdatet wurde, alle Städte, alle bauten, alle forschungen...
Zu anfang hatte jeder nur 1 stadt von daher wars kein problem 30 städte zu berechnen aber inzwischen sind es 2k städte und da lass ich des alles von nem cronjob berechnen wobei ich da bald auch bissel umarbeiten muss (die einzelnen aufgaben auf mehrere cronjobs aufteilen) da der Cronjob mittlerweile knapp ne minute zum berechnen brauch...
gepostet vor 19 Jahre, 5 Monate von AlphaWolf
@Balduran

Wenn du das nur mit Cronjob machst dann sieht das doch komisch aus, wenn ein Gebäude/Forschung fertig sein soll (von der Zeit her), es aber noch 2min oder so auf fertigstellung wartet. Wie löst du das da?
gepostet vor 19 Jahre, 5 Monate von Balduran
da steht dann "Fertig" bis der Update script angeht...
meine User sind einigermaßen tollerant und die stört des nit (5 minuten is ja keine welt )
aber ok es is doof.. das game is dann nicht in realtime

vielleicht sollte man en programm schreiben was immer an is und immer überprüft ob was fertig is
gepostet vor 19 Jahre, 5 Monate von arnonuehm
warum so kompliziert?

ich würde das gebäude in die table einfügen und einen timestamp speichern, wann das gebäude fertig gebaut sein soll. erst wenn die aktuelle zeit time() > timestamp ist, kann das gebäude etwas produzieren.

so kann man auch ganz simpel einen baustatus im haupthaus abfragen ->
if(timestamp > time())
{
// es wird bereits gebaut
}
gepostet vor 19 Jahre, 5 Monate von Balduran
hab ich doch.. in jeder stadt kann nur ein gebaeude zugleich gebaut werden
und in der tabelle für städte is auch ne spalte für "zu bauendes Gebäude" -> ID und "zu bauendes Gebäude" -> timestamp / fertigstellungsstamp
gepostet vor 19 Jahre, 5 Monate von da_weedkilla
Original von The_Alien
Oder man pfeift einfach auf die paar Ress zwischen fertigstellung und nächstem login des Users. Auffallen tut das meistens eh keinem da es eh nicht so viel ist.

Ich berechne die Res wenn sich ein User einloggt, dann werden alle gebäude etc aktualesiert und danach erst mit den neuen Minen gerechnet.


Oder man pfeift auf Minen mit Bauzeit. Hängt natürlich auch vom Spiel ab aber meine sind immer sofort einsatzbereit...

Aber um die Zeitschaltung, wie auch immer man sie realisiert (werde Crons nehmen da ich C++ und das Zeug wohl niemals kapiere ), komm ich wohl trotzdem net drum rum, weil mein Spiel Bots hat, die sich pünktlich einloggen müssen. :roll:

Auf diese Diskussion antworten