Automatisieren von PHP-Skripten unter Ubuntu

Automatisieren von PHP-Skripten unter Ubuntu

Durch die Automatisierung des Imports meines Skillplaners stand ich vor der Problem, wie ich nun die Importskripte automatisiere.

Ein Skript mittels eines Cron aufrufen ist ja kein Problem, aber ein PHP-Skript im Hintergrund aufrufen, war mir bis dahin noch unbekannt.

Um Anderen, die eventuell die Suche zu erleichtern, werde ich hier mein Vorgehen mal beschreiben.

Zunächst muss man die Cron Verwaltung über folgenden Befehl aufrufen:

crontab -e

Mein Ziel war es täglich um 5 Uhr eine Prüfung auf Updates zu machen und das Ergebnis dann in einer Logdatei zu dokumentieren.

0 5 * * * /usr/bin/wget -q -O  /pfad/zur/log/datei/log.log http://www.meinedomain.de/update_skript.php

Das funktionierte auch soweit, die Logdatei enthielt die Ausgabe die man bekommt, wenn man das Sktipt im Browser aufruft.
Jedoch wurde die Logdatei jeden Tag neu erstellt und die vorherige ersetzt. Einen Verlauf zu loggen war so also nicht möglich.

Ich will nun dazu sagen, dass einige Profis nun sagen „Warum hat er es so umständlich gelöst“, ich aber bei weitem kein Profi bin 😉
Meine Lösung funktioniert und das ist für mich die Hauptsache. Ebenso habe ich nach stundenlangem Suchen nichts gefunden, was mein Vorhaben auf anderem Wege gelöst hätte.
Alternativen können gerne in die Kommentare geschrieben werden.

So genug drum herum geschrieben, hier meine Lösung:

Zunächst rufe ich wie oben beschrieben das Update Skript auf.

0 5 * * * /usr/bin/wget -q -O  /var/www/pfad_zum_log_verzeichnis/temp.log http://www.meinedomain.de/update_skript.php

Hier lege ich die Logdatei allerdings zunächst als temporäres Logfile an. Wichtig ist, dass dieses in einem dem Webserver zugänglichen Verzeichnis angelegt wird.
Anschließend wandle ich 45 Minuten später, nachdem alle Skripte vermutlich durchlaufen sind mein temporäres Logfile in das eigentliche Logfile um.

45 5 * * * cd  /var/www/pfad_zum_log_verzeichnis/; mv temp.log update.log

Im Update Skript selbst prüfe ich dann, ob die Logadtei vorhanden ist, um eine Fehlermeldung beim Ersten Ausführen zu verhindern, wenn die Datei noch nicht erstellt wurde, bzw. wenn ich sie mal lösche.

Anschließend lese ich ihren Inhalt als Variable $log_alt ein.

if (file_exists(„./logs/update.log“)) {
$log_alt = file_get_contents(„./logs/update.log“);
}

Meine anschließende Ausgabe des Update Skripts gestaltet sich dann wie folgt.

if (file_exists(„./logs/update.log“)) {
echo $log_alt;
}
echo date(„d.m.Y – H:i:s“, time()).“ – Prüfung abgeschlossen, Update wird ausgeführt! \r\n“;

Wieder wird geschaut, ob die Datei besteht, wenn ja wird ihr Inhalt ausgegeben und anschließend der neue Text angehängt. Wichtig hier ist das \r\n am Ende des neuen Textes, um einen Zeilenumbruch zu erzeugen.
Tut man das nicht wird die Logdatei aus nur einer Zeile bestehen, in der alle Ausgaben nach einander aufgeführt sind.

Diese Ausgabe wird dann wieder über den ersten Cron um 5 Uhr als temp.log abgespeichert, dann 45 Minuten später in das originale Log gewandelt und am nächsten Tag erneut eingelesen.
Der Umweg über die temporäre Datei ist daher nötig, da der Cron die Logdatei überschreibt, bevor er das Skript ausführt. Daher kann man auf diese Art niemals das alte File einlesen, da es gelöscht wird, bevor der Befehl zum Einlesen überhaupt ausgeführt wird.

Kommentar verfassen

Archive

Diese Seite benutzt Cookies, um die Nutzerfreundlichkeit zu verbessern. Mit der weiteren Verwendung stimmst du dem zu. Datenschutzerklärung

%d Bloggern gefällt das: