Ankündigung

Einklappen
Keine Ankündigung bisher.

Dienstplan statt Dienste/Cronjobs?

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

  • Dienstplan statt Dienste/Cronjobs?

    Hallo Leute ich habe mal eine konzeptionelle Frage.

    Nein keine Cronjobs, bitte einen Post weiter !

    Also ich habe mal vor irgendwann Dienste bereitzustellen für mein CMS/Website.
    Ich habe technisch betrachtet keine Ahnung wie Cronjobs an sich funktionieren, jedenfalls hätte ich jetzt nicht vor die Standardaufstellung von PHP in irgendeiner Art und Weise umszustellen um den Betrieb für Cronjobs zu gewährleisten. Ich suche aktuell dennoch Ideen und Anregungen wie ich meine grundliegende Idee verbessern könnte.

    Ansatz:
    - Client oder Administrator ruft Website auf
    - Website wird geladen
    - Cronjob wird ausgeführt in bestimmten Fällen am absoluten Ende der Datei (Siehe unten)
    PHP-Code:
    //GET Information by TXT/CSV/JSON/XML File
    if($timestamp $cronjob_nextop_timestamp){
     include(
    'acp/cronjob_execute.php');
     
    //Execute Pending or near Timestamp Cronjobs (+- Tolerance value)
     //Calculate and Save into File new execution Value for cronjob_execute

    Die entsprechende Textdatei sollte in etwa so aussehen um daraus Informationen abzuselesn.
    Code:
    cr_status:inactive/active/busy+(start_timestamp)
    cr_nextupdate:(timestamp | NOT NULL)
    möglicherweise ein oder anderer Wert der das funktionieren des Dienstes zusätzlich sicherstellt
    Der Punkt dabei ist, keineswegs darf beim Client angezeigt werden das die Website weiter lädt, und die max_execution_time muss ebenfalls künstlich mit vom Server aus verlängert werden, so dass dieses Script in Ruhe die Arbeit verrichten kann.
    Insofern fallen include und so ein Kram flach da diese im Browser ein weiterer Ladevorgang sind.

    Idee Nr.1: AJAX?
    Idee Nr.2: Andere PHP Funktionen?

    Ideen, Kritik, Anregungen, Bewertungen, Kommentare, Bedenken zu der Idee/Ansatz sind mir sehr Willkommen um mir ein Bild machen zu können wie ich diesen Ansatz am besten umsetze...

    Grüße: TheRedox


  • #2
    Zitat von theredox Beitrag anzeigen
    Ich habe technisch betrachtet keine Ahnung wie Cronjobs an sich funktionieren
    Dann solltest Du Dich unbedingt zuallererst mit dem Wesen und der Funktion von Cronjobs vertraut machen, bevor Du diesen Begriff verwendest - das, was Du hier beschreibst, hat nichts mit Cronjobs zu tun (oder aber ich habe Deinen Text nicht in Problemstellung uminterpretieren können... )

    !!! --> http://de.wikipedia.org/wiki/Cron

    Kommentar


    • #3
      glasskugel :---

      atd
      fork

      Kommentar


      • #4
        Ok, ja kenne ich nur von WBB v3+ den Begriff...
        Nö möchte nicht darauf bauen UNIXoides zu brauchen.

        Dann nennen wir das mal um in so etwas wie PHP 'Dienste' bei Ausführung also so etwas wie ein 'simulierter Dienst', der nach Ablauf eines Zeitspempels eine automatische Abfolge beginnt. Die Haken darin ist, das der Client nur die Anweisung an PHP weitergeben soll, ohne sich weiter im Browserladevorgang zu beteiligen, so dass eine Serie von Routinen die nach Dienstplan noch anstehen ausgeführt werden. Bzw. der Aufruf wird nur an PHP abgegeben ohne das der Browser sich weiter daran beteiligt?

        Diestplan:
        Code:
        id | Datei                            | timestamp
        1 |db_cleaner.php                | 10
        2 | db_stats.php                  | 3600
        3 | db_collect_comments.php | 36000
        Die entsprechende Datei für den Vergleich wird gestellt (sonst müsste ja jedesmal die gesamte Tabelle aufgerufen werden) in CSV/JSON/TextDatei.

        Inhalt CSV/JSON Textdatei im Timestamp 0:
        Code:
        service_status:inactive/active/busy+(start_timestamp)
        service_nextupdate: 10 (timestamp | NOT NULL)
        möglicherweise ein oder anderer Wert der das funktionieren des Dienstes zusätzlich sicherstellt
        Im Timestamp 20 wird die Seite durch die Administrationsoberfläche oder dem Client ein Aufruf gestartet.
        - PHP bemerkt das etwas im Dienstplan ansteht das ausgeführt werden muss
        - PHP gibt Anweisung an eine andere PHP Datei, sich auszuführen ohne im Browser einen weiteren Ladevorgang anzuzeigen
        - Ladevorgang der im Browser aufgerufenen Datei beendet.
        - Andere PHP Datei modifiziert die CSV/JSON/TXT Datei:
        Code:
        service_status:inactive/active/busy+(start_timestamp)
        service_nextupdate: 10 (timestamp | NOT NULL)
        möglicherweise ein oder anderer Wert der das funktionieren des Dienstes zusätzlich sicherstellt
        - Andere PHP Datei führt die Aktionen aus die nach Dienstplan anstehen in etwa so:
        PHP-Code:
        //GET Information by TXT/CSV/JSON/XML File
        if($timestamp $service_nextop_timestamp){
         include(
        'acp/service_execute.php');
         
        //Execute Pending or near Timestamp service (+- Tolerance value)
         //Calculate and Save into File new execution Value for service_execute

        - Operationen ausgeführt CSV/JSON/TXT Datei wird wieder Freigegeben und neu geschrieben (Ende in Timestamp 55):
        Code:
        service_status:inactive/active/busy+(start_timestamp)
        service_nextupdate: 3600 (timestamp | NOT NULL)
        möglicherweise ein oder anderer Wert der das funktionieren des Dienstes zusätzlich sicherstellt
        Vllt. erklärt es die Logik dahinter etwas besser ?
        Da fehlt jetzt ein bisschen Umgebung um die Automatisierung zu vollziehen, grundliegend ein 'Refresh' Interval, aber dafür müsste erstmal das Prinzip hinhauen.
        Also auch eher weniger ein Dienst sondern eher ein Dienstplan der nach Plan jedoch auch mit möglicher Verzögerung ausgelöst wird.

        Kommentar


        • #5
          Du wirst um einen "echten" Cronjob nicht rumkommen. Solltest Du das mit Deinem Hostingpaket nicht tun können, dann schau mal hier: https://www.google.de/search?q=kostenlose+cronjobs. Dazu noch ein Script, dass das antriggert und Du bist "ready to go"

          Kommentar


          • #6
            Mach es lieber richtig als ne Schrottlösung! Cronjobs sind nun wirklich nicht schwer.

            Bekommst du einen Handjob hin, wirst du es auch mit einem Cronjob schaffen

            Hast du irgendwo webspace gemietet, musst du in der Regel nur ne Zeit und den Pfad zum Script angeben und fertig.

            Kommentar


            • #7
              Also auch eher weniger ein Dienst sondern eher ein Dienstplan der nach Plan jedoch auch mit möglicher Verzögerung ausgelöst wird.
              atd gibts auch für windows.

              Kommentar


              • #8
                Ich denke du suchst hiernach: [MAN]pcntl_fork[/MAN]. Es teilt den aktuellen Prozess in zwei auf, sodass der erste, auf den der Browser wartet, aufhören kann, während ein zweiter unabhängig davon weiterläuft.
                PHP-Code:
                if($timestamp $cronjob_nextop_timestamp) { 
                  
                $pid pcntl_fork();
                  if(
                $pid == 0) {
                    
                // hier sind wir im Kindprozess
                    
                macheCronjobKram();
                  } else {
                    
                // hier sind wir im "originalen" Elternprozess
                    
                exit();
                  }

                Es ist allerdings erstmal die Frage, ob du diese Funktion überhaupt benutzen darfst. Die ist oft deaktiviert. Wenn du sie tatsächlich benutzen darfst, würde ich erstmal mit einem einfachen Beispiel rumspielen wie dem hier:
                PHP-Code:
                <?php
                $pid 
                pcntl_fork();
                if(
                $pid == 0) {
                    
                // Kindprozess
                    
                for($i 0$i 10$i++) {
                        
                file_put_contents("testdatei.txt"time()."\n"FILE_APPEND);
                        
                sleep(2);
                    }
                } else {
                    
                // Elternprozess
                    
                echo "Ich bin schon um ".time()." fertig, aber die Datei wird immernoch beschrieben";
                }

                ?>

                Kommentar


                • #9
                  Die Frage wäre wozu brauchst du überhaupt cron-ähnliche Vorgänge für das Projekt ?
                  [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                  Kommentar


                  • #10
                    Statt den Prozess abzutrennen, kann du auch einfach einen neuen Starten, zum Beispiel ein kleines C Programm, welches selbst wieder eine php ausführt.
                    Das geht zum Beispiel mit der system() Funktion. Musst nur ein & hindranstellen, damit das aufrufende php Script weiterläuft, bzw vorher auch noch die Ausgabe umleiten, nach /dev/null, oder in eine Textdatei.
                    Fatal Error: Windows wird gestartet

                    Wie administriert man ein Netzwerk: Beispiel

                    Kommentar


                    • #11
                      Zitat von Yarith Beitrag anzeigen
                      Ich denke du suchst hiernach: [MAN]pcntl_fork[/MAN]. Es teilt den aktuellen Prozess in zwei auf, sodass der erste, auf den der Browser wartet, aufhören kann, während ein zweiter unabhängig davon weiterläuft.
                      PHP-Code:
                      if($timestamp $cronjob_nextop_timestamp) {
                      $pid pcntl_fork();
                      if(
                      $pid == 0) {
                      // hier sind wir im Kindprozess
                      macheCronjobKram();
                      } else {
                      // hier sind wir im "originalen" Elternprozess
                      exit();
                      }

                      Es ist allerdings erstmal die Frage, ob du diese Funktion überhaupt benutzen darfst. Die ist oft deaktiviert. Wenn du sie tatsächlich benutzen darfst, würde ich erstmal mit einem einfachen Beispiel rumspielen wie dem hier:
                      PHP-Code:
                      <?php
                      $pid 
                      pcntl_fork();
                      if(
                      $pid == 0) {
                      // Kindprozess
                      for($i 0$i 10$i++) {
                      file_put_contents("testdatei.txt"time()."\n"FILE_APPEND);
                      sleep(2);
                      }
                      } else {
                      // Elternprozess
                      echo "Ich bin schon um ".time()." fertig, aber die Datei wird immernoch beschrieben";
                      }

                      ?>
                      Vielen Dank erstmal für diesen Ansatz, ich muss mich entschuldigen, war eine Weile out of area/service. Ich werde mir diesen Ansatz sobald der an der Ordnung steht mal anschauen, jedenfalls macht das mit dem fork grundliegend Sinn.
                      Ob ich diese Funktion benutzen darf, hängt wohl davon ab, was ich meinen Plesk wohl mitteile (dafür gibt ja es eine Liste). Der Server sitzt selbstverständlich auf Debian, da komme ich mit Copy und Paste recht gut über die Runden wenn ich in die Konsole muss.

                      trOy Ich brauche diesen Dienstplan/Cronjobartige Struktur um Aufgaben zu erledigen, wie z.B. Statistiken anfertigen zu Besucherzahlen (z.B. täglich, monatlich, jährlich) oder auch Sprachen (z.B. Nachfrage für spanischen, englischen oder deutschen Content.
                      Als Auslöser dieser Struktur soll ein Besuch über ein genannten Zeitstempel + Zeitraum überschreiten, sollte dieser nicht ausgelöst werden gilt dieser Tag/Woche/Monat als 0. Ebenfalls soll dieser Mechanismus z.B. greifen, wenn im Administrationsbereich Aufgaben fällig sind (wie z.B. eine Datenbankabschnittswartung, Nach Updates gesucht werden soll o.ä.).
                      Wichtig wäre bei solchen Aufgaben auf jedenfall, dass diese nicht durch eine max_execution_time behindert werden oder das Laden bei einem Client beinträchtigen. Zur Zeit sind auch nur 353 Elemente in diesem CMS untergebracht + Übersetzungen/Automatische Übersetzungen, wenn aber der Content steigt kann ich dem User nicht zumuten den gesamten Ladeprozess 'aufzuhalsen' wenn er für eine Auslieferung der Website 35-50ms im Schnitt wartet, wenn die Anfertigung einer Statistik z.B. eine Minute benötigt. Daher fragte ich auch ob ich PHP einmal via Client aufrufen kann und diesen quasi abgeschottet Serverseitig, die Aufgaben erledigen lasse die nach Dienstplan anstehen.

                      Grade habe ich nur ein ganz anderes Problem das mir Kopfschmerzen bereitet, dass wäre nämlich emscripten-dosbox und wie ich das automatisiere, da ich zur Zeit dort nur Bahnhof verstehe, komischerweise muss ich das alles einmal über Debian installieren, die Frage die ich mir anbei nur stelle ist ob ich dann auch jedes DosGame auch noch auf JS portieren muss, blöderweise gibt es nichts vorkompiliertes zum runterladen/testen. Auf JDosBox kann ich nicht bauen, da ich kein Zertifikat und kein Geld für ein Zertifikat für Java habe, auf JSDosBOX kann ich auch nicht bauen, weil es einfach schlecht funktioniert (auf Chrome so gerade, dennoch eher schlecht als recht). Selbstverständlich könnte ich auch auf regulären Frameworks wie cake und jsdingbumsda oder bootstrap setzen, aber diese auf die eigenen Bedürfnisse anzupassen braucht ebenfalls ähnlich viel Zeit als das selbst zu bauen, daher baue ich dann doch die Baustelle lieber selbst ein Lernprozess schleicht sich dort durchaus mit ein.

                      Naja das nur nebenher, besten Dank für die Antworten bisher.
                      Mit freundlichen Grüßen
                      theredox

                      @php.net team, schickes update

                      Kommentar


                      • #12
                        Cronjobs sind nun wirklich nicht schwer



                        Kommentar


                        • #13
                          Zitat von theredox Beitrag anzeigen

                          Ob ich diese Funktion benutzen darf, hängt wohl davon ab, was ich meinen Plesk wohl mitteile (dafür gibt ja es eine Liste).
                          (...)

                          @php.net team, schickes update
                          es spricht ja nun nichts gegen:
                          PHP-Code:
                          if (function_exists('pcntl_fork') && function_exists('posix_kill') ){ /***/ 
                          und hier ist nichts php.net team.
                          trotz des neuen favicon kann ich dir auch sagen, hier nichts volksbank.

                          Kommentar


                          • #14
                            Mh... nach meinen ersten Erfahrungen mit AJAX werde ich wohl weiter auf einen Dienstplan setzen dennoch ist dieser wohl in dieser Form nicht umsetzbar. Daher werde ich die Idee in dieser Form, definitiv verwerfen und auf ein Benachrichtigungssystem setzen, an dem AJAX hängt im Adminpanel um eine anstehende Aufgabe/n zu erledigen. Danke für pcntl_fork, an sich ein guter Ansatz, aber damit werde ich dann doch weniger anfangen können als erwartet.

                            Daher kann dieser Thread geschlossen werden. (d.w. finde ich die Markierung wieder nicht oO)

                            Grüße theredox

                            Kommentar


                            • #15
                              Das was du suchst sind keine cronjobs, sondern ein deamon. Der "just-in-time" und "terminiert" Dinge tun kann. Sowas kannst du auch mit PHP bauen. Anbieten würde sich zur Prozess-Kommunikation ZeroMQ.
                              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                              Kommentar

                              Lädt...
                              X