-
[cron] Cronjobs
Hi
Ich habe ein Problem mit der cron-Erweiterung. Nach erfolgreichem ausführen des Jobs, wird kein nextrun mehr eingetragen, obwohl ich "Nur einmal ausführen" abgeschalten habe.
Bei folgendem Code im CronController.php Zeile 90 steht:
PHP-Code:
if ($cronJob['completed']) {
if ($cronJob['runonce'])
$dataset = array(
'lastrun' => $currtime,
'nextrun' => 0,
'scheduled' => 0,
'enabled' => '0'
);
else
$dataset = array(
'lastrun' => $currtime,
'nextrun' => $this->schedule($q),
'scheduled' => $currtime
);
$this->Database->prepare("update `tl_cron` %s where id=?")
->set($dataset)
->$execute($q->id);
} // if
'nextrun' => $this->schedule($q),: Sollte eigentlich eingetragen werden.
Ich habe es an einem richtigen Cron angeschlossen. Mein Code:
PHP-Code:
class Statistics extends Frontend
{
/**
* Initialize
*/
public function __construct()
{
$this->import('Database');
$this->import('Environment');
}
/**
* Create daily member information
*/
public function createDailyMemberInformation()
{
// Check wether today is the last day of the year
(date('d-m') == '31-12') ? $blnLastDayOfTheYear = true : $blnLastDayOfTheYear = false;
// Check wehter today is the last day of the month
(date('d') == date('t')) ? $blnLastDayOfTheMonth = true : $blnLastDayOfTheMonth = false;
$objMembers = $this->Database->prepare("SELECT COUNT(*) AS total FROM tl_member WHERE login=1")->execute();
// Data
$arrData['tstamp'] = time();
$arrData['members'] = $objMembers->total;
$arrData['lastDayOfTheMonth'] = $blnLastDayOfTheMonth;
$arrData['lastDayOfTheYear'] = $blnLastDayOfTheYear;
$insertId = $this->Database->prepare("INSERT INTO tl_statistics %s")->set($arrData)->execute()->insertId;
// Log
$this->log('A new daily member information (ID ' . $insertId . ') was created', 'ModuleStatistic createDailyMemberInformation()', TL_CRON);
}
$objStatistics = new Statistics();
$objStatistics->createDailyMemberInformation();
Hat jemand ne Ahnung was ich falsch gemacht habe oder warum kein nextrun eingetragen wird?
-
Hat niemand eine Idee? :(
-
Irgendwelche Fehler wenn CronCorntroller.php manuell aufgerufen wird?
-
Nein, gar keine. Die Seite ist ganz weiss.
-
Funktioniert denn der Bespielsscript PurgeLog.php korrekt, d.h. wird dort ein neuer nexrun eingetragen?
Falls ja solltest du dein Script vielleicht ebenfalls mal von Backend ableiten statt von Frontend, wie im Beispielscript.
-
Ja es funktioniert. Wenn ich mein Script alle Minuten (* * * * * *) ausführen lasse, wird ein nextrun eingetragen, aber nicht, wenn ich es alle Tage (0 0 * * * *) ausführen lassen möchte. Liegt das an der manuellen bzw. maschinellen Ausführung? Sollte ja nicht.
-
Also nachdem du den Fahrplan geändert und abgespeichert hast, solltest du das Backend nochmal refreshen damit nextrun berechnet wird. Falls das nicht passiert ist definitiv bei dir etwas faul. Du hast doch nichts an der Erweiterung geändert, oder? Sonst vielleicht mal in der Erweiterungsverwaltung einen Repair starten (update Button).
-
Im Backend funktioniert es, wenn ich speichere und refereshe. Im Frontend funktionert es auch, wenn ich es alle Minuten ausführen lasse. Es funktioniert aber nicht im FE, wenn ich es nur alle Tage ausführen lassen möchte. Dann wird kein nextrun eingetragen. Keine Ahnung warum. :(
Ich habe es gestern Abend nochmals versucht und im BE nochmals abgespeichert. Es hat sich alles eingetragen, auch nextrun. Nachdem es aber ausgeführt wurde, wurde kein nextrun mehr eingetragen. Heute sieht es nun so aus:
Code:
Statistics
Minute
0
Stunde
0
Tag im Monat
*
Monat
*
Wochentag
*
Letzte Ausührung
20.08.2010 00:00
Nächste Ausführung
-
Ich habe gestern ebenfalls mal den PurgeLog mit 0 0 * * * aufgesetzt, bei mir hat es allerdings einwandfrei funktioniert und den nextrun korrekt berechnet und eingesetzt (Contao 2.9.1, Cron 1.1.0).
Nextrun wird gelöscht wenn entweder nur die einmalige Ausführung gesetzt wurde, oder innerhalb eines Jahres kein nächster Termin bestimmt werden konnte. Kontrolliere mal das Systemlog und die Logdateien ob dort noch irgendeine Info vorhanden ist. Ev. kannst du selber noch zusätzliche Logs einbauen um das Problem einzugrenzen.
-
Ich habe folgendes in die CronController.php eingetragen:
PHP-Code:
if ($cronJob['completed']) {
if ($cronJob['runonce'])
$dataset = array(
'lastrun' => $currtime,
'nextrun' => 4,
'scheduled' => 0,
'enabled' => '0'
);
else
$dataset = array(
'lastrun' => $currtime,
'nextrun' => $this->schedule($q) ? $this->schedule($q) : 3,
'scheduled' => $currtime
);
Und es hat mir zweimal eine 3 eingetragen. Bei PurgeLog und Statistic. Warum wird hier bei verschiedenen Fällen eine 0 returnt:
PHP-Code:
$allhours = ($_hours==0);
while ($_hours < 24) {
if ($hour[$_hours]) {
$allminutes = ($_minutes==0);
while ($_minutes < 60) {
if ($minute[$_minutes]) return $nextrun;
// increment to next minute
$nextrun += 60-$_seconds;
$_minutes++;
$_seconds = 0;
} // while
if ($allminutes) return 0;
$_hours++;
$_minutes = 0;
} else {
// increment to next hour
$nextrun += 60*(60-$_minutes)-$_seconds;
$_hours++;
$_minutes = $_seconds = 0;
} // if
} // while
if ($allhours) return 0;
} // while
return 0;
} // schedule
-
Ich habe mal versucht bei Stunde */24 anstatt eine 0 einzusetzen, das hat aber auch nicht funktioniert. Im Gegenzug funktioniert */12. Hast du vielleicht nochmals eine Idee, an was das legen könnte?
Noch paar Informationen:
- Die CronController.php wird alle 15 Minuten via "echtem Cron" aufgerufen
- Es werden in der Statistics.php-Datei gleich 5 Funktionen aufgerufen.
PHP-Code:
$objStatistics = new Statistics();
$objStatistics->createDailyMemberInformation();
$objStatistics->createDailyHelperInformation();
$objStatistics->createDailyClientInformation();
$objStatistics->createDailyProjectInformation();
$objStatistics->createDailyIdeaInformation();
- Es erscheinen keine Fehler beim Aufruf der CronController.php
-
Wenns manchmal geht und manchmal nicht, tippe ich darauf dass die Gesamtlaufzeit manchmal höher ist als in den PHP Einstellungen erlaubt und der Server den Prozess dann abwürgt bevor die neue Schedulezeit berechnet werden kann. In diesem Fall könnte es helfen die einzelnen Aktionen auf verschiedene Cron-Jobs zu verteilen (oder wenns etwas luxuriöser sein darf den Script wie in der Doku beschrieben scheibchenweise abzuarbeiten[*], Stichwort "well behaved batches").
[*] Ich kicke den Croncontroller jede Minute via echtem CRON an, das erlaubt die zügigere Abarbeitung der Scheiben.
-
Ich glaub es liegt nicht an dem. Ich habe jetzt mal versucht nur eine Funktion aufzurufen. Es funktioniert so aber auch nicht.
Das Komische ist, dass es ja bei */12 immer geht nur bei 0 oder */24 funktioniert es nicht. Kann es nicht sein, dass es am Modul liegt, vielleicht irgendwo einen Fehler? In der shedule-Fkt.?
-
Es tut mir Leid, dass ich nochmals störe. Es funktioniert aber immer noch nicht. Ich habe versucht, es alle 23 Stunden laufen zu lassen. Dies habe ich sicher 4 probiert und es hat immer funktioniert. Möchte ich es aber alle 24 Stunden laufen lassen, funktioniert es nicht. Ich habe keine Ahnung warum. Ich habe es jetzt gleichzeitig auch mit PurgeLog.php probiert. Es hat aber bei "alle 24 Stunden" auch nicht funktioniert.
Ich wäre dir sehr dankbar, wenn du das nochmals anschauen könntest. Könnte es nicht sein, dass es ein Fehler im Code hat?
Ich danke dir für deine Hilfe!