verhindern, dass die PHP Datei öfter Ihre Aufgabe erfüllt
Mit dem muss man auch bei fehlerfreien Cronjobs ohne Useraufrufe immer rechnen. Die meisten Cron-mäßigen Sachen haben so eine Anforderung nicht, daher wurde bei den Cronservices darauf nicht wirklich geachtet.
Mit etwas synchronisierbarem wie zB. einer Datenbank kann man es aber leicht erreichen, dass ein Mindeszeitraum zwischen den Starts liegen muss (zB. reguläre Starts alle 30min, und per PHP dann prüfen ob seit dem letzten Start min. 28 Minuten vergangen sind. Genau 30/30 geht nicht gut, wegen ein paar Sekunden Fehler würde dann immer wieder mal ein Durchgnag ausgelassen.)
Angenommen, es gibt eine Tabelle meinecrons mit Spalten cronid und laststart (timestamp), und den betroffenen Eintrag gibts schon, in der PHP-Datei vor der eigentlichen Aufgabe einfach sowas machen (pseudocode):
Code:
oldlaststart = SQL(SELECT laststart FROM meinecrons WHERE cronid=$meineid);
if(oldlaststart neuer als 28min) exit(0);
SQL(UPDATE meinecrons SET laststart=now() WHERE cronid=meineid AND laststart=$oldlaststart);
//das zweite Where ist sehr wichtig, nicht weglassen
if(affected_rows != 1) exit(0),
Also zuerst prüfen, ob ein zu neuer Start eingetragen ist. Wenn ja, Ende. Dann die jetztige Zeit eintragen, und bevor die eigentliche Aufgabe aber begonnen wird noch prüfen, ob das Update überhaupt gewirkt hat. Zwischen dem eigenen Select und Update könnte ein anderer Scriptdurchgang gerade seine Zeit reingeschrieben haben (deshalb das zweite Where und die AffectedRows-Sache). Falls das der Fall ist, natürlich auch aufhören, weil das andere Script schon arbeitet.
Mit einer kleinen Erweiterung kann man auch verhindern, dass sich lang dauernde Aufgaben nicht überlappen (also es wird was gestartet, während der vorige Durchgang noch nicht fertig ist): Auch einen "lastactivity"-Timestamp haben, den während der eigentliche Arbeit zB. alle zwei Minuten oder häufiger auf now() setzen, und beim Scriptstart prüfen ob der eingetragene Timestamp mindestens 5 Minuten alt ist. (Wieder mit der Racecondition-Prüfung).