PHP Maniac

Das PHP Blog für PHP-Profis und alle die es werden wollen

Cronjob Alternative mit PHP

17 Mai, 2009 (16:44) | Server, Tipps und Tricks | Von: PHP Maniac

In vielen Webspaceangeboten fehlen heutzutage leider immernoch Cronjobs für das regelmäßige, automatierte Ausführen von wiederkehrenden Arbeiten wie z.B. Backups. Da Webhoster immernoch primär mit Attributen wie Speicherplatz, kiloweise Email-Adressen oder Traffickontingenten auf Kundenfang gehen, könnte die geringe Verbreitung von Cronjobs allerdings auch auf mangelndes Interesse seitens der Kunden zurückzuführen sein. Sei es, da viele überhaupt nicht richtig wissen was Cronjobs sind oder leisten können oder weil nach wie vor einfach zu wenig Backups erstellt werden. Daher möchte ich meinen heutigen Beitrag den Cronjobs widmen und wie eine ähnliche Funktionalität auch ohne „echte“ Cronjobs auf kleinen Webspacepaketen realisiert werden kann.

Was sind Cronjobs

Cronjobs sind quasi die Windows Aufgabenplanung unter Linux. Die so genannten Cronjobs werden in einer Liste, dem Crontab hinterlegt und bestehen aus einem Ausführungszeitpunkt und dem zugehörigen Befehl, der ausgeführt werden soll. Hierbei muss der Ausführungszeitpunkt nicht immer eine bestimmte Uhrzeit an einem bestimmten Tag sein, sondern lässt sich durch Platzhalter relativ frei einstellen. Somit sind tägliche, minütliche, stündliche Aufgaben möglich, aber auch deutlich komplexere Zeitpunkte lassen sich im Crontab definieren.
Im Zusammenhang mit Webseiten oder Webhostingpaketen bieten die Hoster als Cronjobs oft den Aufruf bestimmter Skripte auf einem Server an. Dies entspricht dann quasi einem direkten Aufruf der Webseite oder des PHP Skriptes durch euren Browser, nur dass er immer zum selten Zeitpunkt automatisch durchgeführt wird und ihr nach dem Einrichten des Cronjobs nicht mehr daran denken müsst. Daher eignen sich diese auch sehr gut für lästige Arbeiten, wie den Aufruf eines Backup Skripts.

Cronjob Alternative

Was also tun, wenn der eigene Hoster keine Cronjobs anbietet oder diese in eurem Paket nicht verfügbar sind? Entweder ihr könnt euch von einem Bekannten mit Cronjobs einen Job leihen, da die Zugriffe in der Regel nicht auf einen bestimmten Server festgelegt sind. Alternativ lassen sich wiederkehrende Aufgaben aber auch mit PHP selbst lösen, allerdings gibt es hierbei keine Garantie, dass diese immer zur gleichen Zeit ausgeführt werden. Die vorgestellte Lösung versteht sich also mehr als Notlösung und funktioniert je besser, desto mehr Besucher ihr auf eurer Webseite habt. Für kritische Backups würde ich aber immer empfehlen auf richtige Cronjobs zurückzugreifen.

Die Idee

Die Idee hinter der Lösung ist einfach: Unsere Besucher rufen regelmäßig unsere Webseiten auf. Also können diese doch einfach die Arbeit für uns übernehmen, natürlich ohne das sie davon etwas merken. Wir binden also ein bisschen PHP Code in unsere zentrale index.php (oder eine andere Seite, die häufig aufgerufen wird) ein und lassen dort die Arbeit erledigen. Damit dies nicht bei jedem Besucher auf der Webseite passiert, muss natürlich eine kleine Überprüfung implementiert werden, die die nötigen Arbeiten nur ausführt, falls diese für einen definierten Zeitraum nicht mehr ausgeführt wurden. Hierzu speichern wir nach jedem Durchlauf Zeit und Datum, um bestimmen zu können, wieviel Zeit seit der letzten Ausführung vergangen ist.

Die Umsetzung

$last_run = file_get_contents("cronjob.txt");

if($last_run < (time()-24*3600))
{
	//Backup starten
	include("backup.php");

	//Ausführungszeit speichern
	$fp = fopen("cronjob.txt", "w");
	fwrite($fp, time());
	fclose($fp);
}

Das Skript lädt also zunächst die letzte Ausführungszeit aus einer Datei. Alternativ ist natürlich auch eine Speicherung in einer Datenbank oder ähnlichem möglich. Sind seit der letzten Durchführung mehr als 24h (24*3600 Sekunden) vergangen, so wird der Job gestartet. Hier wird stellvertretend eine backup.php aufgerufen, hier kann natürlich jeder das aufrufen oder eintragen, was er gerne ausgeführt haben möchte. Ist die Aufgabe erledigt, so wird die Ausführungszeit in der Datei aktualisiert und das normale Skript kann weiter ausgeführt werden um den Benutzer mit der Webseite zu versorgen.

Da dies quasi eine Notlösung für alle ist, die keine Cronjobs haben oder bekommen können, gibt es leider noch einige Punkte, die beachtet werden sollten. Zunächst einmal verzögert die Durchführung des Backups oder der Arbeit allgemein natürlich die Auslieferung der Webseite an den Besucher. Daher sollten hier keine zu Zeitintensiven Arbeiten erledigt werden und die Stelle, an der diese aufgerufen werden, weise gewählt werden. Außerdem ist zu beachten, dass vom Backup keinerlei Fehlermeldungen oder Ausgaben erfolgen, da diese sonst an den Benutzer gesendet werden würden. Hier empfiehlt es sich die Ausgaben mit dem Output Buffering abzufangen und per Email an den Administrator zu Debug-Zwecken weiterzuleiten.

Neben den genannten Einschränkungen ist dieser Weg jedoch trotzdem noch eine gute Option einige, Wiederkehrende Arbeiten automatisiert ausführen zu lassen. Natürlich funktioniert dies nur, wenn auch regelmäßig, genug Besucher die Webseite besuchen. Wem dies zu unsicher ist, sollte eh lieber auf richtige Cronjobs zurückgreifen. Im Zweifelsfall kann man diese auch bei einem anderen Hoster als dem eigenen buchen, wenn dieser keine Cronjobs anbietet.

Be Sociable, Share!

Schreibe einen Kommentar