Heute möchte ich euch kurz zeigen, wie man PHP Scripte, die über einen Browser ausgeführt werden müssen, auch per Cronjob z.B. täglich ausführen lassen kann.
Nehmen wir an, wir haben ein PHP Script, dass über die folgende URL aufgerufen wird. Nehmen wir beispielsweise an, dieses Script leert den Cache unserer Anwendung. Die URL für das Script könnte demnach folgendermaßen aussehen:
http://www.meineseite.de/scripte/delete_cache.php
Um also den Cache zu leeren, können wir diese URL einfach im Browser aufrufen. Doch was machen wir, wenn wir das Script nun jeden Tag um 12:00 Uhr ausführen wollen?
Den Cron-Daemon nutzen
Wenn wir das Glück haben, per SSH auf den Server zugreifen zu können und möglicherweise sogar noch root Rechte besitzen, können wir hierfür einen Cronjob für den Cron-Daemon erstellen. Was genau der Cron-Daemon ist, erfahrt ihr hier:
"Der Cron-Daemon ist ein Dienst, der automatisch Skripte und Programme zu vorgegebenen Zeiten, also chronologisch, starten kann. Der auszuführende Befehl wird in einer Tabelle, der crontab, gespeichert. Es gibt systemweite Crontabs, die nur mit root-Rechten bearbeitet werden können, zusätzlich kann jeder Benutzer seine eigene Crontab erstellen."
Source: http://wiki.ubuntuusers.de/Cron
Das bedeutet also, dass wir die Tabelle mit den Cronjob Befehlen bearbeiten müssen und unser Script dort eintragen. Unter Ubuntu funktioniert dies so.
crontab -e
Wenn wir diesen Befehl auf der Kommandozeile ausführen, gelangen wir in einen Editor, wo uns alle bisher vorhanden Cronjobs des aktuellen Nutzers angezeigt werden, sofern welche vorhanden sind. Bei mir unter Ubuntu sieht dies z.B. so aus:
# Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command
Wir können also genau festlegen, welcher Befehl zu welchen Zeitpunkt bzw. in welchen Intervall ausgeführt werden soll. Da wir wollen, dass unser Befehl den Cache zu leeren jeden Tag um 12 Uhr ausgeführt werden soll, müssen wir also folgende Zeile am Ende der Datei einfügen:
0 12 * * * /usr/bin/wget -q -O /var/log/delete_cache.log http://www.meineseite.de/scripte/delete_cache.php
Wie ihr sehen könnt, verwende ich einfach das Linux Programm wget, um die Seite zu laden und gleichzeitig die Ausgabe des Scriptes in eine Log-Datei zu schreiben, welche über den Parameter -O angegeben werden kann.
Weitere Möglichkeiten das Script auszuführen, wären Curl oder Lynx:
#mit curl 0 12 * * * /usr/bin/curl -o /var/log/delete_cache.log http://www.meineseite.de/scripte/delete_cache.php #oder mit lynx 0 12 * * * /usr/bin/curl -dump http://www.meineseite.de/scripte/delete_cache.php
Mehrere Parameter übergeben
Eine Besonderheit die ihr noch beachten solltet sind Parameter, die mit der URL zum Script mitgeschickt werden sollen. Nehmen wir an, wir haben zwei Parameter um den Cache für Artikel und das Gästebuch zu löschen.
http://www.meineseite.de/scripte/delete_cache.php?articles=true&guestbook=true
Dann müssen wir in diesem Falle die URL in der Cron-Tabelle in Anführungszeichen schreiben, oder das & Zeichen mit \ escapen:
0 12 * * * /usr/bin/wget -q -O /var/log/delete_cache.log "http://www.meineseite.de/scripte/delete_cache.php?articles=true&guestbook=true" 0 12 * * * /usr/bin/wget -q -O /var/log/delete_cache.log http://www.meineseite.de/scripte/delete_cache.php?articles=true\&guestbook=true
So, damit sollte es nun kein Problem mehr sein, euch täglich die Arbeit zu sparen um bestimmte URLs aufrufen zu müssen.
Im Allgemeinen sollte es jedoch immer besser sein, solche Script so zu programmieren, so dass sie direkt von der Kommandozeile ausgeführt werden können und nicht per Browser über eine URL aufgerufen werden. Die könnte schließlich auch ein Sicherheitsproblem sein.