Nur für Contao 4.13 Nutzer, in Contao 5 funktioniert das nicht mehr!
Die Erweiterung bringt ein Beispielskript “PurgeLog.php” mit im Verzeichnis “web/bundles/bugbustercron/". Hier kann man schon einiges erkennen wie es läuft. Weiter unten folgt ein weiteres kleines Beispiel.
Generell sollte man versuchen, kleine Jobs, wann immer möglich, zu schaffen, die nicht lange laufen. Zum Beispiel statt der Schaffung eines großen Jobs, das 3 Dinge tut, ist es besser, 3 kleinere Jobs zu schaffen. Auf diese Weise kann die Last in 3 verschiedenen Seitenaufrufe vom Scheduler verteilt werden.
Die Laufzeit eines Jobs sollte kurz bleiben, weil der Benutzer eine Sanduhr so lange zu sehen bekommt bis dieser fertig ist. Wenn es zu lange dauert wird man denken, es gibt ein Problem mit der Website oder mit dem Computer und bricht die Anfrage ab oder schließt gar den Browser.
Es gibt eine globales Array $cronjob die einem hilft den Job in sinnvolle Stücke aufzuteilen, und einige Informationen und Kontrolle bietet:
$cronJob['id']
ID in der Job Table tl_crontab.
Dieser Parameter kann nur gelesen werden, eine Änderung hat keine Auswirkung.
$cronJob['title']
Titel des Jobs.
Dieser Parameter kann nur gelesen werden, eine Änderung hat keine Auswirkung.
$cronJob['lastrun']
Zeitstempel der letzten Ausführung. Der Wert ist 0 wenn unbekannt bzw. noch nie ein Start erfolgte.
Dieser Parameter kann nur gelesen werden, eine Änderung hat keine Auswirkung.
$cronJob['endtime']
Ab dieser Zeit sollt der Job stoppen, z.B. in dem keine neuen Aktionen mehr ausgeführt werden.
Dieser Parameter kann nur gelesen werden, eine Änderung hat keine Auswirkung.
$cronJob['runonce']
“true”: der Job wird nach komplettem Durchlauf deaktiviert.
Das kann im Job selbst geändert werden:
Setzt man $cronJob['completed'] auf “false”, wird der Job nicht deaktiviert auch wenn $cronJob['runonce'] auf “true” gesetzt ist.
$cronJob['logging']
“true”: die Protokollierung des Jobs ist eingeschaltet, für Testzwecke gedacht.
“false”: nur Fehler werden protokolliert, so sollte der Job im Normalfall eingestellt sein.
Dieser Wert kann vom Job geändert werden, führt aber eventuell zur Verwirrung der Nutzer:
$cronJob['completed']
Dieser Status ist per Default “true” und bedeutet, wenn der Job fertig ist wird dieser als erledigt markiert und wird neu geplant. Benötigt der Job zu viel Zeit und man hat die Möglichkeit diesen abzubrechen und beim nächsten Aufruf an der Stelle weiter zu machen, setzt man diesen Status auf “false” und beendet den Job. Dadurch wird der alte Zeitplan beibehalten und beim nächsten Scheduler Aufruf der Job wieder gestartet, um die Arbeit abzuschließen.
Script liegt hier unter web/bundles/bugbustercron/PurgeLog.php
<?php
use Psr\Log\LogLevel;
use Contao\CoreBundle\Monolog\ContaoContext;
/**
* Contao Module "Cron Scheduler"
* Sample PHP script to execute by cron: Purges the system log
* Job: web/bundles/bugbustercron/PurgeLog.php
*
* @copyright Glen Langer 2020 <http://contao.ninja>
* @author Glen Langer (BugBuster)
* @package Cron
* @license LGPL
* @see https://github.com/BugBuster1701/contao-cron-bundle
*/
/**
* Initialize the system
*/
if (!defined('TL_MODE'))
{
define('TL_MODE', 'BE');
$dir = __DIR__;
while ($dir != '.' && $dir != '/' && !is_file($dir . '/system/initialize.php'))
{
$dir = dirname($dir);
}
if (!is_file($dir . '/system/initialize.php'))
{
echo 'Could not find initialize.php!';
exit(1);
}
require($dir . '/system/initialize.php');
}
/**
* Class PurgeLog
*
* @copyright Glen Langer 2020 <http://contao.ninja>
* @author Glen Langer (BugBuster)
* @package Cron
*/
class PurgeLog extends Backend
{
/**
* Initialize the controller
*/
public function __construct()
{
parent::__construct();
} // __construct
/**
* Implement the commands to run by this batch program
*/
public function run()
{
global $cronJob; // from BugBuster\Cron\ContaoBackendController Class
//no directly call
if (!is_array($cronJob))
{
die('You can not access this file directly!');
}
//At this time the job should be defered,
//no new actions should be started after this time.
if (time() >= $cronJob['endtime'])
{
$cronJob['completed'] = false;
return;
}
\Database::getInstance()->prepare("DELETE FROM `tl_log`")->execute();
if ($cronJob['logging'])
{
\System::getContainer()
->get('monolog.logger.contao')
->log(LogLevel::INFO,
'System log purged by cron job.',
array('contao' => new ContaoContext('PurgeLog run()', TL_GENERAL)));
}
} // run
} // class PurgeLog
/**
* Instantiate log purger
*/
$objPurge = new PurgeLog();
$objPurge->run();