Cronjob für Contao unter einem Uberspace-Account anlegen

Heute ein kleiner Quicktipp wie man den Cronjob für Contao serverseitig anstupst.
Normalerweise wird der Cronjob mittels folgenden JavaScript-Schnipsel im Template ausgelöst:

<script src="<?php echo TL_ASSETS_URL; ?>assets/contao/js/scheduler.js?t=<?php echo $this->cronTimeout; ?>" id="cron"></script>

Warum sollten wir nun die Cronjobs auf einen serverseitigen Aufruf auslagern? Zum einem wird durch den Aufruf im Frontend die Cronjobs nicht pünktlich ausgeführt und zum anderem muss eine weitere JavaScript-Datei geladen werden. Das hat zur Folge das die Seite länger lädt und der PageSpeed von Google sinkt.

Um das Laden der JavaScript-Datei zu verhindern, loggen wir uns als Administrator in das Contao-Backend ein und deaktivieren unter System » Einstellungen » Globale Einstellungen, die Checkbox “Den Command Scheduler deaktivieren”.

cronjob_contao_1

Wir speichern die Einstellungen und melden uns wieder vom Backend ab. Als Nächstes verbinden wir uns mittels SSH auf unser Uberspace-Konto ein (Geht am besten mit Putty oder deren Derivat).

Im Uberspace-Wiki  ist sehr schön beschrieben, wie man Cronjobs anlegt. Wir bearbeiten daher als erstes die Crontab:

crontab -e

Ich bevorzuge eher den VI zum bearbeiten, daher gebe ich vorher noch folgendes in die Konsole ein:

export VISUAL='vi'

Damit überhaupt Cronjobs ausgeführt werden können, müssen wir noch den Pfad zu den PHP-Binaries und unseres etc-Verzeichnis angegeben. Das hat den Hintergrund, dass sonst das Script nicht gestartet wird. Mehr Hintergrundinformationen dazu im Uberspace-Wiki.
In der letzten Zeile wird zur cron.php navigiert (damit die relativen Angaben in der cron.php passen) und schließlich die cron.php ausgeführt. Es reicht aus, wenn wir den Cronjob stündlich einmal ausführen (0 * * * *):

PATH=/package/host/localhost/php-5/bin:/bin:/usr/bin
PHPRC=/home/USERNAME/etc
0 * * * * cd /var/www/virtual/USERNAME/DOMAIN/system/cron && php /var/www/virtual/USERNAME/DOMAIN/system/cron/cron.php

Update 15.08.2013:

Da es beim Erstellen der XML-Dateien (Sitemap etc.) zu Fehlern kommt, empfiehlt es sich einen anderen Cronjob einzurichten. Das Problem hierbei ist, wenn eine PHP-Datei über CLI aufgerufen wird, werden der superglobalen Variable $_SERVER keine Informationen über dem Webserver bereitgestellt, daher ist beispielsweise SERVER_NAME im Index nicht definiert. Somit werden daher falsche URLs generiert. Mit folgenden Cronjob werden die Cronjobs von Contao ordnungsgemäß ausgeführt:

5 * * * * wget -t 1 -O - http://beispiel.de/system/cron/cron.php >/dev/null 2>&1

Erklärung: Der Cronjob wird jeweils 5 Minuten nach der vollen Stunde ausgeführt. Der Befehl wget wird daher nur einmal (-t 1) ausgeführt und der Output (-0) in das definierte Nichts geführt.