SQL MySQL automatisieren

Skidrow1988

Lieutenant
Registriert
Nov. 2014
Beiträge
947
Moin Leute, ich benötige mal euer Schwarmwissen. Jeder kennt die Situation. Man baut z.B. ein HQ in einem Spiel das Zeit X benötigt. Nun ist dieses Gebäude irgendwann auch mal fertig. Wie setzen das Entwickler um, das es dann auch in diesem Moment fertig ist. Ich frage nicht umsonst. Manch wissen es ja, das ich ein kleines Spiel für mich selbst entwickle um etwas zu lernen. Ich weis, ist eigentlich alles völlig überambitioniert, ist aber auch nicht für die Öffentlichkeit gedacht.

Bei mir wird es momentan so aktualisiert:
Sobald der Spieler die Übersicht mit seinen Gebäuden öffnet, wird diese auf Aktualität geprüft.
Wenn diese fertig sind, bucht er der Rohstoffe der Gebäude
Im letzten Schritt wird dann das Gebäude wieder auf Null gesetzt. So, das es wieder etwas produzieren kann.

Das ganze passiert bei mir mit einem PHP Script. Ich finde das, und ihr bestimmt auch, zu umständlich. Ich dachte mir, das es auch einfacher gehen muss oder auch "richtiger".

Das Spiel läuft bei mir mit XAMP Local. Gibt es eine einfache Möglichkeit das automatisiert, also im Hintergrund umzusetzen?

Lieben Dank an alle!
 
Ich würde den Fertigstellungszeitpunkt im Vorhinein berechnen und auch beim Client hinterlegen und bei der nächsten "online session" nach diesem Zeitpunkt die Daten mit dem Server verifizieren, damit der Client den Zeitpunkt nicht selbstständig manipulieren kann.
 
  • Gefällt mir
Reaktionen: Raijin und madmax2010
Ich schreibe momentan das Ende in die Tabelle mit anderen Daten rein. Beim aufrufen der Tabelle prüft er dann, ob es fertige Ware gibt und updatet diese dann.
 
vorweg: XAMPP bitte nicht öffentlich ins internet exposen. das ist zum testen OK, aber nicht, wenn der PC deienr bleiben soll
\

Sonst: Viele Wege fuehren nach rom. Du kannst den State in json / xml dateien pro player halten, du kannst relationale oder schemalose datenbanken nutzen, musst das dann halt entsprechend in Code verwandeln.

Ich wuerde einfach sqlite nehmen, wenn nicht zu viele parallel spielen
 
Das wird nie veröffentlicht. Es gibt nichtmal einen Login. Es ist für mich lediglich ein Mittel um Sachen kennenzulernen.

Ich habe bereits eine Datenbank mit MariaDB erstellt. Die würde ich gerne nutzen. Am Anfang dachte ich an Cronjobs. Doch wie oft rufe ich die auf etc. Ist das überhaupt effizient etc.
 
Eine Variante, falls du selber hostest, ist php-cli zu verwenden und einfach in ner Schleife laufen lassen. Das ist dann dein Game-Loop.

Für eine smoothe User Experience könntest du z.B., falls es nichts zu tun gibt, alle Sekunde schauen, ob es in der DB einen neuen Eintrag gibt, den du dann verarbeitest. Und z.B. wenn es etwas zu tun gibt, dann für 10 Sekunden zügiger pollen, z.B. alle 100 ms.

Unter Linux könntest du einen FIFO aufmachen, da schreibt jeder Prozess, der ein zu verarbeitendes Event angelegt hat, ein Byte rein und du liest in dem Prozess das byte raus und weist, dass es wieder was zu tun gibt. Das ganze ist natürlich sehr Race-Condition-Anfällig (saubere Transactions in MariaDB verwenden z.B.), aber das wird es bei Multi-Client Webanwendungen immer zu beachten sein.

Überlege dir auch, welcher Prozess schreibend irgendwo auf Tabellen zugreift. Also was passiert, wenn z.B. jemand ein Gebäude baute, das x kostet und es "gleichzeitig" zweimal baut, dass es da kein "double spending" geben.

Du könntest z.B. nach dem MVC-Konzept arbeiten, der php-cli Prozess ist dein C, dein M ist die Datenbank und die V ist dein UI, dass du als Webseite auslieferst, du queuest dann immer Commands zum Controller, der die dann gemütlich abvespert und dann die M aktualisiert. Dadurch bist du quasi "Single-threaded" und musst dir über Nebenläufigkeiten keine Gedanken machen.
 
  • Gefällt mir
Reaktionen: BeBur, Skidrow1988, Falc410 und eine weitere Person
Skidrow1988 schrieb:
Ich rufe das PHP Script per Cronjob auf.
mach das lieber als systemd unit.
aber warum ueberhaupt? du kannst doch alle daten in der DB halten und beim aufruf abfragen, ob etwas fertig ist
 
  • Gefällt mir
Reaktionen: joperi
madmax2010 schrieb:
du kannst doch alle daten in der DB halten und beim aufruf abfragen, ob etwas fertig ist
Ahh, dangerous...

Wenn viel ansteht, lädt das erste mal die Seite ewig. Dann klickt der Nutzer nochmal, das Skript wird abgebrochen (mglw. abhängig von den Einstellungen). Auch braucht dann jeder PHP-FPM (oder wasauchimmer) die volle Ausstattung an Rechten und Ressourcen, das ist nicht gerade robust.
Oder andere Nutzer warten und sehen nix, weil grade das Skript angestoßen worden ist.

Auch ist es sehr inflexibel, falls mal Push-Nachrichten dazukommen sollten (z.B. Emails als Premiumfunktion).
 
Ich sehe da auch keinerlei Anlass für einen Cronjob. Für sowas läuft im Hintergrund ein Gameserver-Prozess mit einem Timer, der Anfragen von den Clients entgegennimmt.

Cronjobs setzt man ein, wenn man zu fixen Zeitpunkten Aufgaben (Backups, Systemchecks, Updates etc.) anstoßen will.
 
Wie Hancock schon schreibt, hast du bei normalen Spielen einen Game-Loop. Also eine Endlosschleife die (abhängig von Implementierung) bei jedem Frame oder jede Sekunde z.B. immer wieder das selbe ausführt und viele Dinge überprüft.
Bei einem klassischen Spiel muss ja bei jedem Frame die Eingabe vom Spieler (also z.B. Mouseklick) eingelesen werden, dann Daten wie "wo ist der Spieler, wo ist der Gegner" ausgewertet werden und anschließend das Bild gerendert werden.
Wenn du jetzt ein Webspiel entwickelst, würde ich auch eine Schleife programmieren die in regelmässigen Ticks (z.B. eben jede Sekunde) alle möglichen Werte überprüft und aktualisiert. Die Berechnung darf natürlich nicht länger als dein Tick dauern.

Alternativ könntest du auch async Funktionen nutzen mit Callbacks der sich zurück meldet wenn Gebäude X fertig ist. Finde ich aber nicht so schön, da ja in der Zwischenzeit irgendwas passiert sein könnte und du die Funktion abbrechen müsstest etc. (also z.B. Gebäude wurde während des Baus abgebrochen, pausiert, zerstört oder ähnliches)

Und das ganze natürlich nicht als Cronjob sondern als "Endlosschleife" laufen lassen. In Anführungszeichen weil du natürlich das ganze schon steuern möchtest, also nicht einfache while(true) sondern ein Daemon oder ähnliches drumherun welches den Thread starten und stoppen kann.
 
  • Gefällt mir
Reaktionen: Skidrow1988
Vielen Dank für diese ausführlichen Antworten. Ich sagte ja, es gibt wieder etwas zu lernen. :)
 
  • Gefällt mir
Reaktionen: madmax2010
joperi schrieb:
Cronjobs setzt man ein, wenn man zu fixen Zeitpunkten Aufgaben (Backups, Systemchecks, Updates etc.) anstoßen will.
Damals, als ich jung war hust, waren Cronjobs oft das einzige, was es bei vielen Hosting-Anbietern gab. Am Ende ist eine Gameloop, gerade bei den klassischen Browserspielen, auch nur etwas, das regelmäßig aufgerufen wird.

Das lässt sich mit einem Cronjob super umsetzen, anders als das vorgeschlagene "Update bei Zugriff". Hier muss man schon direkt das nächste Problem lösen: Wie sorgt man sauber dafür, dass das nicht bei jedem Zugriff von X Clients passiert und wie bekommte man die Aktualisierung an alle "aktiven" Teilnehmer weitergeleitet um z.B. den State in der UI anzupassen. Deutlich einfacher zu lösen, wenn der Server die Tickrate vorgibt und sich daraus bestimmte Zeitpunkte, wie die Fertigstellung des HQ, vorberechnen lässt.
 
Bezogen auf das Gebäude gäbe es zwei Lösungswege:
A) Ein Prozess, in deinem Fall ein PHP-Skript, läuft 24/7 und zb durch eine while-Schleife, die niemals verlassen wird, arbeitest du die Punkte ab, die zum jeweiligen Zeitpunkt passieren sollen und aktualisiert dann entsprechend die Daten des Gebäudes in der Datenbank
B) Du lädst den Zustand des Gebäudes erst dann, wenn der User die Informationen anfordert und rechnest dann an Hand der Erstellzeit des Gebäudes und der aktuellen Zeit, welchen Zustand es haben sollte.

Letzteres dürfte aber vermutlich selten sinnvoll sein, weil man ja vermutlich live irgendwas anzeigen will. Also irgendeine Ressource des Gebäudes wie Geld wird hochgezählt und ist ständig durch den Spieler sichtbar?!

Einen Cronjob könnte hilfreich sein, um zu überwachen, dass der Prozess noch läuft und wenn nicht, diesen neu anstößt. Zb bei einem Neustart des Webservers, käme der Prozess dann automatisch wieder ans Laufen.

Je nachdem wie viele Sachen man dann parallel verarbeiten muss, hat man dann später vielleicht sogar mehrere PHP Prozesse, die verschiedene Dinge erledigen und auch für eine Lastverteilung sorgen. Das wird man aber erst mit der Zeit sehen.

Natürlich hat der besagte PHP Prozess nichts mit der eigentlichen Ausgabe für den Spieler zu tun. Dafür braucht es wieder andere Skripte/Prozesse, die dann zb per SELECT die aktuellen Informationen dem Spieler darstellen.
 
  • Gefällt mir
Reaktionen: Skidrow1988
@mgutt
Ich gucke mir gerade PHP CLI an. Ich muss nur meine MySQL Datenbank beschleunigen. Das buchen einer Produktion dauert bei 80 Buchungen 8 Sekunden. Ich bin mir nicht sicher, das das so läuft wie ich mir das vorstelle
 
Skidrow1988 schrieb:
@mgutt
Ich gucke mir gerade PHP CLI an. Ich muss nur meine MySQL Datenbank beschleunigen. Das buchen einer Produktion dauert bei 80 Buchungen 8 Sekunden. Ich bin mir nicht sicher, das das so läuft wie ich mir das vorstelle
Klingt so, dass hier die Grundkenntnisse fehlen.
 
Dafür mache ich das ganze ja. Es dient mir zum lernen. Ich brauche aber immer ein Ziel dafür. Es ist ja nichts öffentliches
 
Wenn da was langsam ist, dann muss man es analysieren. Was ist genau langsam. Wie ist die DB Struktur (z.B. fehlen die Indizes). Usw. Hier mal alles zu erklären oder zu analysieren, würde bedeuten, dass man den Quellcode sehen muss. Alles andere bringt nichts.

Und Ziel zu haben ist es gut. Nur mit der Fragestellung hier wird dir kaum geholfen.
 
Zurück
Oben