Meowsalot: Cronjob

Hallo,

ich habe bei All-Inkl folgende Optionen für einen Cronjob zur verfügung

Damit habe ich nun ein kleines Problem. Ich muss jeden zweiten Freitag automatisch eine Mail verschicken. Wie könnte ich dieses umsetzten? Gibt es in PHP eine Funktion die mir sagen kann welches Datum jeder zweiter Freitag ist? Dann könnte ich den Cronjob wöchtenlich einrichten und prüfen ob das Heutige Datum = das Datum von jedem zweiten Freitag ist.

Oder wie würdet ihr dieses umsetzten?

Bis bald!
Meowsalot (Bernd)

  1. Hallo Meowsalot,

    Oder wie würdet ihr dieses umsetzten?

    je nachdem welche Rechte du bei deinem Anbieter hast, könntest du Cjob auch manuell(ohne allink-Interface) anlegen. Ist aber kompliziert für jemand der das nicht oft macht(mich zb. 😉)

    Daher würde ich in deinem Fall die Arbeit PHP erledigen lassen, also cjob ruft script auf(jeden freitag), dieses prüft Datum und sendet mail dann raus.

    *Nachtrag

    Musste gerade nochmal nachdenken… Das machst du doch bereits oder nicht, also ein PHP-Script aufrufen? Dann wärs ja nur noch ein zwei Zeilen dazu zu fügen zur Prüfung ob's der 2. Freitag ist. Also cjob wie gehabt jeden Freitag einmal.

    Gruss
    Henry

    --
    Meine Meinung zu DSGVO & Co:
    „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
    1. Hallo Henry,

      Musste gerade nochmal nachdenken… Das machst du doch bereits oder nicht, also ein PHP-Script aufrufen? Dann wärs ja nur noch ein zwei Zeilen dazu zu fügen zur Prüfung ob's der 2. Freitag ist. Also cjob wie gehabt jeden Freitag einmal.

      die Frage ist dann nur noch, wie kann ich mit PHP prüfen ob wir heute den zweiten Freitag im Monat haben? Diesen Monat wäre es der 13 und 27.

      Bis bald!
      Meowsalot (Bernd)

      1. Hallo Meowsalot,

        wenn du dir die date-Funktion von PHP anschaust gibt es da einen Parameter der dir die Kalenderwoche gibt. Und alle zwei Wochen ist das eine gerade Zahl.

        LG Count

      2. Hallo,

        die Frage ist dann nur noch, wie kann ich mit PHP prüfen ob wir heute den zweiten Freitag im Monat haben? Diesen Monat wäre es der 13 und 27.

        wenn es jede zweite Woche sein soll, prüfen ob die Kalenderwoche gerade ist. Wenn es jeder zweite und vierte Freitag im Monat sein soll, Datum durch sieben teilen, aufrunden und auf zwei oder vier prüfen.

        Gruß
        Jürgen

      3. Hallo Meowsalot,

        die Frage ist dann nur noch, wie kann ich mit PHP prüfen ob wir heute den zweiten Freitag im Monat haben? Diesen Monat wäre es der 13 und 27.

        Da hast du die Qual der Wahl. PHP bietet so eine Vielzahl von Datumsberechnungen an, dass die Entscheidung oft schwer fällt.

        Ich persönlich, würde es mir aus den strtotime mit Textphrasen zusammenstellen und auswerten, also wenn zb. der 2. Freitag ist dann tu dies oder eben nicht, usw…

        Beispiel zur Erkennung:

        <?php
        
        $x1 = strtotime("First Friday of this month");
        $x2 = strtotime("Second Friday of this month");
        
        echo date("D, d.m.Y",$x1);  
        
        echo '<hr>';
        
        echo date("D, d.m.Y",$x2);  
        
        ?>
        

        Gruss
        Henry

        --
        Meine Meinung zu DSGVO & Co:
        „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
        1. Hallo Henry,

          das "First Friday of this month" ist Magie? 😱
          Da kommt tatsächlich ein Datum raus - Fri, 06.07.2018

          Aber wirklich weiterbringen tut mich das jetzt nicht wirklich? Genauso wenig wie mein Ansatz

          echo date( "Y-m-d", strtotime( "2018-07-06 +2 week" ) );
          

          Ich habe ein Startdatum, z.B. den 06.07.2018. Ab diesem Datum sollen alle zwei Wochen eine Mail verschickt werden. Verstehe es einfach nicht, ich muss ja irgendwie prüfen ob ein Datum mit einem anderen Datum übereinstimmt nur dann darf etwas verschickt werden.

          Bis bald!
          Meowsalot (Bernd)

          1. Hallo,

            was sagt ihr zu meiner Lösung?

            function Kalenderwoche()
            {
              $kw = 0;
              $kw = date('W', time());
              return $kw;
            }
            
            $zahl = Kalenderwoche();
            
            $wochentage = array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
            $zeit = strtotime("2018-07-22");
            
            if ($zahl % 2 != 0) {
            	echo "";
            } else {
            	
            	if ($wochentage[date("w", $zeit)] == "Freitag") {
            		echo "Mail verschicken";
            	};
            }
            

            Bis bald!
            Meowsalot (Bernd)

            1. Hallo Meowsalot,

              was sagt ihr zu meiner Lösung?

              sieht erst mal sehr gut aus. Müsstest mal einen Testlauf mit zukünftigen Daten der nächsten Jahre machen.

              Ich hatte zwischenzeitlich, aufgrund deiner letzten Antwort einen anderen, vielleicht viel zu komplexen, Ansatz. Ich hatte nämlich dabei den Eindruck, dass es dir gar nicht nur um den Freitag geht, sondern die ganze Woche und du eine Art Newsletter entwickelst, der abhängig vom Eintragsdatum individuell alle 2 Wochen senden soll.

              Da wäre jetzt die ganz einfache Lösung, die ich schon genannt hatte, sofern du immer den jeweilig letzten Aussendetag speicherst und von dort 2 Wochen weiter rechnen lässt.

              Wenn das aber nicht so ist, sondern beliebigen Spielraum haben möchtest, dann mal hier als Anregung. (Wie gesagt, ist schon spät und daher viell. auch zu kompliziert gedacht)

              Wenn beliebiger Wochentag, dann auch cjob einmal am Tag.

              
              <?php
              
              $user_start = '2018-07-06';
              
              
              // Als Beispiel zukünftiges Datum
              $heute = 1534464000;  // entspricht Fr. 2018-08-17
              
              $heute2 = 1535068800;  // entspricht Fr. 2018-08-24
              
              
              function chk2weeks($start, $now, $max = 200)
              {
              
              // testet alle 2wochen Zieltage(maximal in $max)
              
              for($i=1; $i < $max; $i++){
              $next = strtotime( "$start +2 week" );
              
              // könntest jetzt auch mal alles in ein array speichern um zu testen was passiert
              # $alltargets[] = date("D, d.m.Y", $next).' -> '.$next.'  | '.date("dmY",$now).'  --- '.date("dmY",$next);
              
              
              if( date("dmY",$now) == date("dmY",$next) ){$ok=1;break;}
              
              $start = date("Y-m-d",$next);
              
              } //end for
              
              // Nur Testausgabe, falls du es mal ins Array gespeichert hast
              # print_r($alltargets);
              
              if($ok){return $now;}
              return false;
              
              
                
              } // end func.
              
              
              
              
              echo '<h3>Wenn heute Fr. 2018-08-17 wäre</h3>';
              
              if(chk2weeks($user_start,$heute))
              {
              // Wenn es zutrifft, kannst du hier nun deine Anweisung geben, was passieren soll.
              
              echo 'ja mail soll gesendet werden';
              }
              else{echo 'Datum nicht passend, keine Mail senden';}
              
              
              echo '<h3>Wenn heute Fr. 2018-08-24 wäre</h3>';
              
              if(chk2weeks($user_start,$heute2))
              {
              // Wenn es zutrifft, kannst du hier nun deine Anweisung geben, was passieren soll.
              
              echo 'ja mail soll gesendet werden';
              }
              else{echo 'Datum nicht passend, keine Mail senden';}
              
              
              ?>
              

              Gruss
              Henry

              --
              Meine Meinung zu DSGVO & Co:
              „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
      4. hi,

        die Frage ist dann nur noch, wie kann ich mit PHP prüfen ob wir heute den zweiten Freitag im Monat haben?

        Der Cron stellt sicher, daß das Script einmal an jedem Freitag ausgeführt wird. Eine Prüfung im Script, ob das aktuelle Datum ein Freitag ist, ist also unnötig.

        Ich würde hier die Scriptaufrufe zählen (Zähldatei) und prüfen ob die Zahl gerade ist.

        MfG

        1. Hello,

          hi,

          die Frage ist dann nur noch, wie kann ich mit PHP prüfen ob wir heute den zweiten Freitag im Monat haben?

          Wenn man das Script prüfen lässt, kann das Modul aber universeller werden. Ein Eintrag in cron.daily würde dann reichen.

          Der Cron stellt sicher, daß das Script einmal an jedem Freitag ausgeführt wird. Eine Prüfung im Script, ob das aktuelle Datum ein Freitag ist, ist also unnötig.

          Ich würde hier die Scriptaufrufe zählen (Zähldatei) und prüfen ob die Zahl gerade ist.

          Ganz schlechte Idee!

          Wenn ein Aufruf verloren geht, ist das System durcheinander.
          Ich würde für jeden Teiljob einen Eintrag in eine Taskdadtei vornehmen und den bei Erfolg als erledigt kennzeichnen. Das ist alterprobtes Batchworking.

          Liebe Grüße
          Tom S.

          --
          Es gibt nichts Gutes, außer man tut es!
          Das Leben selbst ist der Sinn.
          1. Hello,

            Wenn ein Aufruf verloren geht, ist das System durcheinander.

            Selbstverständlich wird jeder Prozess protokolliert und somit geht da gar nichts durcheinander.

            Ich würde für jeden Teiljob einen Eintrag in eine Taskdadtei vornehmen und den bei Erfolg als erledigt kennzeichnen. Das ist alterprobtes Batchworking.

            Der Prozess könnte auch selbst ins Protokoll schauen, wann der letzte erfolgreiche Abschluss war. Wenn der 14 Tage zurückliegt, werden die Mails gesendet, ansonsten nicht.

            Sofern das die Aufgabe war. MfG

  2. hi,

    die Berechnung des Datum für jeden zweiten Freitag ist ganz einfach. Jeder Tag hat eine Nummer von 1 (Mo) bis 6 (Sa) und der Sonntag hat die 0.

    Du ermittelst die Tagesnummer für den 1. des Monats. z.B. hat der 1.1.2018 die Nummer 1 weil das ein Mo ist.

    Nun ziehst Du diese Nummer einfach von 13 ab und erhältst 12 Also ist der 12.1. der zweite Freitag.

    Nochn Beispiel: der 1.7.2018 ist ein Sonntag, wir rechnen 13 - 0 und erhalten den 13.7.2018

    Die Formal lautet also: 13 minus numerischer Wochentag für den 1. des Monats

    MfG

    PS: Wenn der 1. auf einen Sa fällt, ist der 2. Fr eine Woche später.

    1. Hello,

      hier ist doch zunächst die Aufgabebstellung ungenau.

      Ist jeder zweite Freitag gemeint, oder jeder zweite Freitag im Monat? Manche Monate sollen ja durchaus fünf Freitage haben, weiß ich aus Hörensagen ;-P

      Außerdem hat auch jeder Tag im Jahr eine lfd. Nummer. Da könnte man daher mit Offset und Modulo arbeiten.

      Liebe Grüße
      Tom S.

      --
      Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
      1. Hello,

        hier ist doch zunächst die Aufgabebstellung ungenau.

        Ist jeder zweite Freitag gemeint, oder jeder zweite Freitag im Monat?

        Meine Formel berechnet jeden 2. Freitag für den jeweiligen Monat. MfG

      2. Hallo TS,

        Ist jeder zweite Freitag gemeint, oder jeder zweite Freitag im Monat? Manche Monate sollen ja durchaus fünf Freitage haben, weiß ich aus Hörensagen ;-P

        ich meine jeden zweiten Freitag ab einem bestimmten Datum. Der Fall mit fünf Freitage haben wir nächsten Monat ;)

        Da stellt sich mir natürlich die Frage, ob meine Berechnung von hier auch funktioniert?

        Bis bald!
        Meowsalot (Bernd)

        1. hi

          Ist jeder zweite Freitag gemeint, oder jeder zweite Freitag im Monat? Manche Monate sollen ja durchaus fünf Freitage haben, weiß ich aus Hörensagen ;-P

          ich meine jeden zweiten Freitag ab einem bestimmten Datum.

          Welches Datum?

          Da stellt sich mir natürlich die Frage, ob meine Berechnung von hier auch funktioniert?

          Das würde ich testen und das Ergebnis mit der Aufgabenstellung vergleichen.

          MfG

        2. Tach!

          Ist jeder zweite Freitag gemeint, oder jeder zweite Freitag im Monat? Manche Monate sollen ja durchaus fünf Freitage haben, weiß ich aus Hörensagen ;-P

          ich meine jeden zweiten Freitag ab einem bestimmten Datum. Der Fall mit fünf Freitage haben wir nächsten Monat ;)

          So ziemlich alles am Kalender ist unregelmäßig. Wenn du da eine Regelmäßigkeit brauchst, kommst du immer wieder zu einer der Unregelmäßigkeiten, die es zu berücksichtigen gilt. Worauf aber kann man sich verlassen? Die Woche hat immer 7 Tage. Bei einer fortlaufenden Tageszählung kommt der Freitag also abwechselnd auf eine gerade Tagesnummer oder eine ungerade. Du müsstest also testen, ob die Tageszahl gerade oder ungerade ist, je nachdem, wann dein Ereignis starten soll.

          Woher kommt aber die Tageszahl? Das Jahr kann man nicht nehmen, das wechselt gelegentlich von 365 auf 366 Tage. Es gibt aber die Julianische Tagesnummer, die ohne Ausnahme fortlaufend gezählt wird. Die bekommt man mit unixtojd() aus einem Unix-Timestamp. Der Rest ist eine Modulo-Operation mit 2.

          dedlfix.

          1. Tach!

            Die Woche hat immer 7 Tage. Bei einer fortlaufenden Tageszählung kommt der Freitag also abwechselnd auf eine gerade Tagesnummer oder eine ungerade. Du müsstest also testen, ob die Tageszahl gerade oder ungerade ist, je nachdem, wann dein Ereignis starten soll.

            Klasse!!! Eine richtig gute Überlegung, da muss man erstmal draufkommen!

            MfG

            --
            Scaliger->new()->jd();
        3. Hallo Meowsalot,

          Da stellt sich mir natürlich die Frage, ob meine Berechnung von hier auch funktioniert?

          meine tut's. 😉

          Gruss
          Henry

          --
          Meine Meinung zu DSGVO & Co:
          „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
  3. Geht das nur so? Oder kannst Du die crontab (via ssh) auch direkt bearbeiten?

    # m  h   dom mon dow   command
      10 11  *   *   5      if [ "0" = $(echo $(date +"%V")%2 | bc) ]; then TUWAS.sh; fi
    
    • Jeden Freitag um 10:11;
    • echo $(date +"%V") # Wochennummer (liefert heute "30"). (man date)
    • echo "30%2" | bc # Rest der Division durch 2 (0 wird als String "0" geliefert)
    • [ "0" = "0" ] # test, ob "0" kam
    • then TUWAS.sh:

    Was soll an jedem Freitag mit gerader Wochennummer um 10:11 gemacht werden?

    1. Hallo Regina,

      Was soll an jedem Freitag mit gerader Wochennummer um 10:11 gemacht werden?

      Wenn am 26.okt versendet werden soll, wären 2 Wochen weiter der 9. Nov. Auf gerade/ungerade ist kein Verlass.

      Gruss
      Henry

      --
      Meine Meinung zu DSGVO & Co:
      „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
    2. Tach!

      Was soll an jedem Freitag mit gerader Wochennummer um 10:11 gemacht werden?

      Zu beachten ist, dass "jede gerade Wochennummer" gelegentlich nicht "alle 2 Wochen" ist. Das Jahr 2020 geht bis Woche 53, da ist dann ein Sprung von 3 Wochen drin, bevor es in Woche 02/2021 weitergeht. Das müsste man für den Fall entscheiden, ob das zu manchen Jahreswechseln vertretbar ist.

      dedlfix.

      1. Mir ging es um die wesentlich größere Möglichkeit in der Shell (statt der stark einschränkenden Weboberfläche). Was die genaue Ausführung genau aller 2 Wochen betrifft wäre da noch at:

        An einem solchen Freitag einmalig gestartet:

        #!/bin/sh
        #14-tägig
        # $0 ist der Name des aufgerufenen Skriptes;
        
        #Selbsteintrag in Jobliste
        #Genau 13 Tage nach Ablauf von morgen, 23:00 Uhr. So angeben wegen Zeitverschiebungen durch Ablaufzeit.
        echo "${0}" | at 11pm tomorrow + 13 days; 
        
        #Tu dies, Tu das, Tu jenes (eigentliche Aktion)
        

        Weitere Befehle:

        • atqr - Listet alle at-Jobs auf.
        • atrm - Löschen der Jobs unter Angabe der Jobnummer aus atqr.