Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP "führe Aktion jede Minute aus" Prozess

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP "führe Aktion jede Minute aus" Prozess

    Hallo Leute,

    ich steh vor folgender Herausforderung:

    Ich entwickel zurzeit ein Strategiespiel. In diesem kann ich meine Einheiten von einem Ort zum anderen schicken. Die Orte sind dabei auf der Karte mit X/Y Koordinaten plaziert.
    Wenn ich nun meine Einheiten losschicke wird vorher die Dauer berechnet.

    Da mein Spiel eine Tick Rate von 1 Minute hat, wird also die Distanz zwischen den Orten berechnet, anschließend durch die Geschwindigkeit meiner Einheiten pro Minute geteilt und ich bekomme die Dauer bis zum Ziel in Minuten.

    Soweit kein Problem.

    Jedoch kann es auf dem Weg zu diversen Ereignissen kommen (Feindliche Einheit kreuzt meinen Weg zum Beispiel).

    Das heißt, ich muss nach jeder Minute schauen, ob ein Ereignis an der aktuellen Position meiner Einheiten eintritt.

    Ich häng nun an dem "jede Minute".

    Per Cronjob kann ich das nicht realisieren, da der Prozess des "gehens" ja irgendwann beendet ist, und der Cronjob gelöscht werden müsste.

    Ich kam also auf die Idee dass per shell Script zu lösen.

    In meiner "Schicke Einheiten los" PHP wird dann ein shell Script gestartet welches 1 Minute wartet, dann "meine Einheiten einen Schritt vorgehen lässt" und prüft ob ein Ereignis eintritt.

    Das würde solange ausgeführt werden, bis meine Truppen am Ziel ankommen oder anderswie verhindert sind.

    Dann beendet die shell sich automatisch, da die do/while Bedingung erfüllt wurde.


    Jedoch denke ich nicht dass es eine saubere Lösung ist, den Server mit x shell Scripten zu füllen welche knapp 59 Sekunden im Leerlauf sind.


    Meine Frage ist nun, ob es nicht wesentlich sauberere Wege gibt dieses Problem der "warte 1 Minute und prüf auf Ereignis" Sache zu lösen.

    Kennt jemand eine solche Lösung oder hat andere, bessere Vorschläge als meinen Ansatz?

    Mit freundlichen Grüßen,

    Timmy



  • #2
    Vielleicht noch folgendes:

    Beim schreiben des Beitrags kam mir die Idee alle "gehen" Aktionen in einer Datenbanktabelle zu speichern und anhand dieser jede Minute per Cronjob die nötigen Funktionen auszuführen.

    Wäre ein alternative Ansatz, da ich so weniger Last auf den Server lege mit all den Leerlauf Scripten.

    Da könnte es jedoch zu Problemen geben wenn einfach zu viele "gehen" Aktionen existieren inkl. aller SELECT und UPDATE Zugriffe auf die Datenbank.

    Eine Kombination oder alternative wäre eventuell ein Ansatz.

    Kommentar


    • #3
      hi,

      hast du dir schon einmal den PHP Daemon angesehen?

      https://github.com/shaneharter/PHP-Daemon

      vlt. hilft dir das weiter.

      Kommentar


      • #4
        MOD: Verschoben von PHP-Fortgeschritten
        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Zitat von CaptainXTimmy Beitrag anzeigen
          Vielleicht noch folgendes:

          Beim schreiben des Beitrags kam mir die Idee alle "gehen" Aktionen in einer Datenbanktabelle zu speichern und anhand dieser jede Minute per Cronjob die nötigen Funktionen auszuführen.

          Wäre ein alternative Ansatz, da ich so weniger Last auf den Server lege mit all den Leerlauf Scripten.

          Da könnte es jedoch zu Problemen geben wenn einfach zu viele "gehen" Aktionen existieren inkl. aller SELECT und UPDATE Zugriffe auf die Datenbank.

          Eine Kombination oder alternative wäre eventuell ein Ansatz.
          So würde ich es machen. Zumindest mal ausprobieren und sehen was für eine Last beim Server entsteht.
          Relax, you're doing fine.
          RTFM | php.de Wissenssammlung | Datenbankindizes | Stay fit

          Kommentar


          • #6
            Lass deine "CronJobs" von der Datenbank erledigen, MySQL zum Beispiel bietet dafür "Events".
            Ganz allgemein solltest du dich von dem Gedanken verabschieden, Dinge in der realen Zeit dann zu berechnen, wann sie im Spiel "passieren".
            Dauert der Marsch von Spieler A 3 Stunden speichere dir Start- und Endzeit, macht Spieler B nach 1:30 ("realer Zeit") einen Zug, der 20 Minuten später den Weg kreuzen würde wird das Ereignis genau dann berechnet und als solches gespeichert.
            Damit musst du "nur" dann irgendwas machen, wenn ein Zug tatsächlich ausgelöst wird, ein Cron ist dafür dennoch sinnvoll, da mit steigender Spielerzahl auch die notwendigen Berechnungen zunehmen.
            actra.development - Zend Certified Engineer for PHP5 - actra-oss @ github

            Kommentar

            Lädt...
            X