Archive for the ‘Cronjob’ tag
Das Test-Fax-Projekt kurz vorgestellt
Mir ist aufgefallen dass ich noch gar nichts über mein Test-Fax-Projekt geschrieben habe. Um etwas mit Fax-Dokumenten zu arbeiten und zu spielen habe ich vor einigen Monaten die kleine Webseite http://www.test-fax.de erstellt. Dort kann man sein neues Fax-Gerät oder seine neue Fax-Software testen indem man einfach ein Fax an die angezeigte Nummer schickt.
Das empfangene Fax landet in einem IMAP-Postfach, das ich mit PHP periodisch abfrage. Falls ein Fax, das in diesem Fall ein tiff-Anhang an der E-Mail ist, vom Cronjob-Script gefunden wird, extrahiere ich den Anhang, wandle es in ein png Bild um, erstelle ein Vorschaubild und trage es in eine Datenbank ein. Die Webseite ist dann einfach nur eine Anzeige der empfangenen Faxe, wobei es auch eine kleine Javascript-Funktionalität gibt die das Backend alle 10 Sekunden nach neu empfangenen Fax-Bildern befragt.
Mehrere Scripte via Cronjob parallel aufrufen
Heute ein kleines Problemchen mit Cronjobs und Parallelität. Normalerweise empfehle ich Gearman wenn es darum geht, mehrere Scripte im Hintergrund laufen zu lassen, aber nehmen wir an dass wir es mit normalen Cronjobs ohne Gearman lösen wollen.
Wir haben also das Script work.php. Wir möchten alle 5 Minuten die Datenbank prüfen ob es Arbeit gibt, und wenn dem so ist, dann soll die Arbeit erledigt werden. Das geht relativ einfach mit einem Cronjob
*/5 * * * * /usr/bin/php /data/work.php
und in der work.php findet dann die Datenbankabfrage statt. Wenn X Ergebnisse in der Datenbank gefunden werden, wird eine Schleife X mal durchlaufen um alles abzuarbeiten. So weit so gut.
Nun sei die eigentliche Arbeit aber relativ zeitaufwändig, sodass ein Schleifendurchlauf 2 Minuten dauert, und bei 5 Aufträgen dauert es also 10 Minuten (wir arbeiten ja seriell in einer Schleife), der Aufruf von work.php überlappt und wir bekommen ein Problem. Angenommen die Aufgabe ist parallelisierbar, d.h. wenn man alle 5 Aufgaben zeitgleich starten würde gäbe es keine Probleme, und die ganze Arbeit wäre nach 2 Minuten erledigt. Wir könnte man soetwas einfach realisieren?