Falsche Berechnung des nächsten Ausführungsdatums
Das nächste Ausführungsdatum wird per \Cron\CronExpression::getNextRunDate($lastExec)
1 berechnet.
Der erste Parameter der Methode erwartet aber eigentlich DateTimeInterface|string $currentTime – Relative calculation date
.
Also das aktuelle Datum von dem aus der nächste Zeitpunkt berechnet werden soll.
Das führt dann beispielsweise dazu, dass noch nie ausgeführte Crons sofort ausgeführt werden, obwohl der entsprechende Zeipunkt noch nicht erreicht ist.
Beispiel:
Es ist 16:25 Uhr.
Ich erstelle einen Cron, der jeden Tag um 22:00 Uhr ausgeführt werden soll (0 22 * * *
).
Sobald das Cron Skript um 16:26 Uhr ausgeführt wird, wird auch mein Cron ausgeführt, obwohl es noch nicht 22:00 Uhr ist.
Das liegt daran, dass das letzte Ausführungsdatum bei noch nie ausgeführten Crons auf 1970-01-01 00:00:00
gesetzt wird2.
Dieses Datum wird dann der \Cron\CronExpression::getNextRunDate()
Methode übergeben, die (richtigerweise) 1970-01-01 22:00:00
als nächstes Ausführungsdatum berechnet1.
Im Code wird dann geprüft, ob das berechnete Datum vor dem aktuellen Datum liegt3.
Wenn das der Fall ist, wird der Cron ausgeführt.
Da die Bedingung immer zutrifft, wird der Cron also sofort ausgeführt.
Reproduzierbares Beispiel anzeigen
<?php
if (!defined('QUIQQER_SYSTEM')) {
define('QUIQQER_SYSTEM', true);
}
if (!defined('QUIQQER_AJAX')) {
define('QUIQQER_AJAX', true);
}
require_once __DIR__ . '/bootstrap.php';
$cron = new \Cron\CronExpression('15 20 * * *');
$lastExec = new DateTime();
$lastExec->setTimestamp(0);
echo $cron->getNextRunDate()->format('%c'); // 2025-06-30T20:15:00+00:00
echo PHP_EOL;
echo $cron->getNextRunDate($lastExec)->format('%c'); // 1970-01-01T20:15:00+00:00
Um das Problem zu lösen, sollte das letzte Ausführungsdatum nicht der \Cron\CronExpression::getNextRunDate()
Methode übergeben werden.
Zusätzlich kann die Logik vereinfacht werden, indem die \Cron\CronExpression::isDue()
-Methode verwendet wird.
Diese gibt true
zurück, wenn der Cron ausgeführt werden sollte.
/cc @mor
-
https://dev.quiqqer.com/quiqqer/package-cron/-/blob/d224d82f62c2b8686e6eb8a2ae4421887e4b93ff/src/QUI/Cron/Manager.php#L363 ↩ ↩2
-
https://dev.quiqqer.com/quiqqer/package-cron/-/blob/d224d82f62c2b8686e6eb8a2ae4421887e4b93ff/src/QUI/Cron/Manager.php#L346 ↩
-
https://dev.quiqqer.com/quiqqer/package-cron/-/blob/d224d82f62c2b8686e6eb8a2ae4421887e4b93ff/src/QUI/Cron/Manager.php#L375 ↩