Ankündigung

Einklappen
Keine Ankündigung bisher.

Cronjob-Architektur !?!?

Einklappen

Neue Werbung 2019

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

  • Cronjob-Architektur !?!?

    Hallo Forum,

    nun werde ich in Kürze anfangen meine Cronjobs zu schreiben und würde mich freuen von Erfahrungen die Ihr gemacht habt zu lernen.
    Vorgestellt hatte ich mir das mein System, mit nur einen auskommen sollte der minütlich ausgeführt wird.
    Hier gibt es dann natürlich eine Art Aufgabenliste mit unterschiedlichen Zeitintervallen so das eben nicht alles permanent abgearbeitet wird sondern je nach Konfiguration nur die entsprechenden Skripte ausgeführt werden.

    Viel mehr interessiert mich das Gebiet der Aufgabenverteilung in unterschiedliche Prozesse, auch wenn die Skripte im Hintergrund ausgeführt werden Laufzeittechnisch ja beschränkt sind, ich meine da am Rande schon mal was von "php-worker" gelesen zu haben.

    Theoretisch würde ich es vllt. dann auch abtrennen zwischen Jobs die Daten sammeln und Jobs die diese dann wiederum verarbeiten wie eine Liste mit E-Mails die gesendet werden müssen. Damit sammelnden und vorbereitende Skripte eben nicht auf den auszuführenden prozess warten müssen bevor diese weiter sammeln können.

    Aber auch was ich sicherheitstechnisch machen kann damit Skripte auf Grund hoher Laufzeiten nicht abgebrochen werden und es zu Daten-Salat kommt.

    MFG: Paykoman

  • #2
    Was versprichst du dir davon Cronjobs mit Cronjobs nachzubauen?

    Kommentar


    • #3
      Hallo,

      macht so eigentlich keinen Sinn. Sobald du php Skripte von der Konsole aus startest, also nicht über den Webserver, haben die automatisch keine Laufzeitbegrenzung mehr. Also laufen die solange, wie sie eben laufen.

      Außerdem: Parallele Abarbeitung von Jobs macht nur Sinn, wenn keine Abhängigkeiten zu einem früheren Prozess gegeben sind. Z. B. macht es keinen Sinn ein Ergebnis ausgeben zu wollen, wenn der Prozess zur Berechnung des Ergebnisses X noch nicht gelaufen ist. Aber anscheinend willst du genau das versuchen.


      Ich würde dein Problem ganz anders angehen und komplett auf Cronjobs verzichten. Starte einfach eine Endlosschleife, die jede Minute erwacht (mithilfe der sleep-Anweisung) und ihre Arbeit verrichtet. Das geht wunderbar mit PHP. Einmal gestartet, lauft das kontinuierlich. Empfehlenswert wäre hier auch einen "Stopp-Schalter" einzubauen. Das würde z. B. mit einer Datei gehen, die immer einen Fixwert enthält, wenn das Skript weiterlaufen soll. Wird dieser Fixwert nun geändert, beendet sich das Skript vor der nächsten Verarbeitung. Auch parallele Abläufe sind hier möglich. Ich rate dir dazu die Erweiterung pthreads anzusehen. Allerdings sollte man dann auch darauf achten, dass alle Threads beendet/terminiert sind, bevor sich das Skript wieder schlafen legt.


      MFG derwunner

      Kommentar


      • #4
        das von dir vorgeschlagene system bietet mE deutlich weniger als cron, dewunner.
        zudem würde ich - wie bei daemon s üblich - die pid in einer datei speichern, um den job zu monitoren. dem job so relativ einfach signale senden zu können, ist sicher auch ein vorteil.

        Kommentar


        • #5
          @derwunner: das klingt ganz interessent, werde mir das mal ansehen =)
          Da könnte man dann ja im Adminbereich ein kleines Skript schreiben das die Schleiffe dann via SSH startet bzw. einmalig aufruft, da muss ich mal schauen wie das am besten zumachen ist.

          Für die Schleife selbst und den Kontrollpunkt hätte ich ganz spontan schon paar Ideen das ist nicht so das Problem...
          Das starten schon eher, die erste Frage die da bei mir auftaucht ist, die sleep-Funktion in Verbindung mit der Ausführungsdauer. Greift sleep() nicht erst nach dem alles durch gelaufen ist? Was ich meine ist, angenommen das Abarbeiten der Aufgaben dauert 25 Sekunden und dann pausiert es 60 Sekunden da die Verarbeitung unterschiedlich ist würde das ganze sich eigentlich immer weiter verschieben geschweige wenn die Verarbeitung länger dauert. Gerade bzw. E-Mails (Newsletter und co.) oder erzeugen von Dokumenten (Rechnungen und sowas).

          Aber vllt. würde ein kleines Beispielskript besser aufzeigen, wie der Ablauf sein könnte.

          Kommentar


          • #6
            eine move to einsteiger fände ich angebracht.

            Kommentar


            • #7
              Zitat von Paykoman Beitrag anzeigen
              Greift sleep() nicht erst nach dem alles durch gelaufen ist? Was ich meine ist, angenommen das Abarbeiten der Aufgaben dauert 25 Sekunden und dann pausiert es 60 Sekunden da die Verarbeitung unterschiedlich ist würde das ganze sich eigentlich immer weiter verschieben geschweige wenn die Verarbeitung länger dauert. Gerade bzw. E-Mails (Newsletter und co.) oder erzeugen von Dokumenten (Rechnungen und sowas).

              Aber vllt. würde ein kleines Beispielskript besser aufzeigen, wie der Ablauf sein könnte.
              Ja, damit hast du recht. Man kann aber auch einfach mit zwei DateTime Objekten die Differenz mit dem sleep und der Ausführungszeit berechnen, sodass das Skript in Wirklichkeit immer insgesamt abzüglich der Ausfürhungszeit eine Minute lang schläft. Sollte das Skript zur Ausführung jedoch länger als eine Minute dauern, dann wäre es sinnvoll, es danach sofort wieder auszuführen. Also ein bisschen Kreativität mit den Abfragefällen ist hier schon noch gefragt, jedoch das Prinzip dahinter ist recht einfach gestrickt

              Kommentar


              • #8
                Erklärung was "php-worker" bedeutet... Du hast einen oder Mehrere Dienste auf einen oder Mehreren Servern... ja du kannst deinem Webserver sagen er soll Dienste laufen haben, die Schauen ob sie etwas zu tun haben... Das kann mittels Queue laufen oder auch einfach ein Event der dem Worker sagt "Du hast jetzt was zum ausführen"... der Worker geht dann her und startet das Script als Kind-Prozess und überwacht diesen mit einer definierten Logik... läuft das Script schon X-Minuten... muss ich dessen Ausgabe wo hin schreiben.

                Sowas braucht man i.d.R. nur wenn man Große Dateien oder Daten in welcher Form auch immer regelmäßig erstellen muss und diese irgendwohin übertragen möchte... dann baut man sich damit "Worker", die bestimmte wiederkehrende Aufgaben ausführen und diese zu Zeit X auf Server Y übertragen und das täglich/stündlich/alle 30 Minuten....
                Homepage: www.jplace.de

                Github: JohnnyDevNull

                Kommentar


                • #9
                  Ich würde über eine Datenbank oder ähnliches einen Task definieren, das php Script (als php-cli) schaut dann in die tasks. Nun ist in der Task irgendein callback definiert. Unser Script delegiert den task dann an den callback.

                  Ich würde hier aber direkt auf crons zurückgreifen und diesen nicht in php nachbauen.

                  Und wie schon gesagt wurde, das verwenden von crons macht nur bei riesigen Datenverarbeitungsoperationen Sinn, oder eben für wiederkehrende Aufgaben.
                  Hybrid developer & Innovation engineer at http://grannyandsmith.com.

                  Blogging about application development and workflows at http://www.marco-bunge.com.

                  Kommentar


                  • #10
                    Hi,

                    wenn du ein bißchen lernen und Spass (und viel Ärger) haben willst, bau sowas. Aber wenn es funktionieren soll lass es bleiben, bau dir PHP-Skripte mit symfony/console oder ähnlichem und lass sie als ganz normale Crons laufen.

                    Gruß

                    Kommentar

                    Lädt...
                    X