Fehlerhafte Berechnung der Ausführungszeit bei Cronjobs die auf bestimmte Wochentage festgelegt sind

  • Affected App
    WoltLab Suite Core

    Falsche Berechnung des Ausführungsdatums


    Der Fehler liegt in wcf/lib/data/cronjobs/CronjobsExec.class.php auf Zeile 948 (bzw. Zeile 934).
    Da wird der Tag der Woche mit dem aktuellen Jahr berechnet, auch wenn der Zeitpunkt der Ausführung eigentlich schon im nächsten Jahr ist. Das sorgt dann dafür, das man bei Angabe das man immer Montags den Cronjob ausführen will dieser dann aktuell erst am 06.01.2011 ausgeführt wird, was ja nicht Montag ist.
    Generell kann es da auch sonst zu Problemen kommen, da ja hier mit der Variable timebase gearbeitet wird, die normalerweise der aktuelle Zeitpunkt sein dürfte.
    Daher gibt es auch dann Probleme wenn man einen Cronjob am Ende eines Monats neu berechnet, dann wird da auch der falsche Ausführungszeitpunkt errechnet.


    Das heißt also, das Cronjobs die an einem bestimmten Wochentag ausgeführt werden sollen nicht zuverlässig sind, da der nächste Ausführungszeitpunkt zu bestimmten Zeiten (Jahreswechsel, Monatswechsel) nicht korrekt berechnet wird.


    Ich überlege mir gerade wie man das beheben kann. Leider ist der Cronjob-Code ja recht komplex, wobei das in meinen Augen nicht wirklich notwendig wäre.
    Wesentlich einfacher (in Codelänge und Komplexität) wäre es, wenn einfach beim Abarbeiten der Cronjobs geprüft würde, ob der Cronjob ausgeführt werden soll oder nicht und nicht das man das nächste Ausführdatum neu berechnet.

    Support gibts (auch ohne Anmeldung) in meinem Forum, nicht per eMail, PN, ICQ, Skype, etc.

  • Lösungsvorschlag: Einfach nachdem das Jahr und der Monat der Ausführung fest stehen nochmal die DoW-Funktion aufrufen und das richtige Datum ermitteln.


    PHP
    $this->getDaysFromDow($this->cronjobsDataResultDate['startMonth'], $this->cronjobsDataResultDate['startYear']);
    $this->cronjobsDataResultDate['startDom'] = $this->cronjobsDataRaw['startDom']['0'];


    Eingebaut auf Zeile 348 am Ende der Funktion getCronjobsDataMonth().
    Wirkt auch wie es soll, damit bekomme ich den richtigen Ausführungszeitpunkt.

    Support gibts (auch ohne Anmeldung) in meinem Forum, nicht per eMail, PN, ICQ, Skype, etc.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!