1.5k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo,

ich habe ein Problem mit meinen Cronjobs. Ich habe sie im Plesk eingerichtet, dort laufen sie alle 3 Minuten. Und zwar ist der Ablauf so:

- Am Anfang des Scriptes hab ich set_time_limit(0) gesetzt
- Verbindung mit DB herstellen und prüfen ob Feld 'locked' auf 1 steht, wenn ja Abbruch, wenn nicht auf 1 setzen (damit nicht mehrere zur gleichen Zeit gestartet werden können
- Ich habe im ganzen Script weder ein exit oder die verwendet
- Am Ende des Scriptes wird 'locked' wieder auf 0 gesetzt

Nun mein Problem:
Wann immer ich das Script manuell ausführe, läuft es ohne Probleme durch. Maximale Laufzeit unter 1 Minute. Wenn ich jedoch den Cronjob hierfür aktiviere, passiert es nach ca. 2 Tagen, dass der Cronjob nicht mehr ganz durchläuft (oder eben nie stoppt, das weiß ich nicht), so dass in der Datenbank teilweise 3 Tage 'locked' auf 1 steht und der Cronjob nicht mehr ausgeführt wird.
Was kann ich tun? die max_execution_time von php dürfte ja kein problem sein. ich kann auch im Script keine Fehler feststellen. Die Frage ist für mich, ob es irgendwie sein kann, dass Scripte trotzdem irgendwie abgebrochen werden? Achso...im error-log steht gar nix...
Ich hoffe ihr könnt mir helfen...ich bin mittlerweile am Ende

Gruß Daniel

6 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Überleg dir einfach, was passiert, wenn dein Skript mittendrin mutwillig beendet wird. Bleiben dann Objekte in deiner DB auf immer "locked"? Du musst einfach davon ausgehen, dass solch ein Fall mal eintreten kann - und dein Skript dementsprechend intelligenter gestalten.

"Manuell" ist das sicher damit nachzustellen, indem du (hoffenlich in einer lokalen Testumgebung) z.B. das Skript anstartest und dann den PHP-Prozess terminierst. Anschließend startest du PHP wieder, startest das Skript erneut, lässt es diesmal zu Ende laufen und guckst, ob dasselbe "Phänomen" auftritt wie beschrieben.

set_time_limit(0) ist übrigens kein Allheilmittel - allein im safe-mode von PHP ist diese Funktion deaktiviert. Prüf also erstmal die Einstellungen deines Providers.
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Gerade in shared-hosting Umgebungen kann es vorkommen, daß zu lange laufende Scripte vom Server gekillt werden.

Mit register_shutdown_function() kannst du eine Funktion festlegen, die beim Beenden des Scripts ausgeführt wird.
0 Punkte
Beantwortet von
Hallo,

erstmal vielen Dank für die Antworten

@son_quatsch: du meinst ja, man muss die scripte intelligenter gestalten. eigentlich dachte ich, dass meins schon intelligent genug ist :-) gibts da noch tricks die ich befolgen kann? das mit dem lock in der db hab ich z.b. auch erst später eingebaut. Sollte man generell kein set_time_limit verwenden? Wenn ja, werd ich das natürlich umbauen, wie wäre es sinnvoll?

@Supermax register_shutdown_function() war mir noch nicht bekannt...das eignet sich vielleicht sehr gut dafür...

Könnt ihr mir noch andere tipps geben, um die cronjobs sicherer zu machen?
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
gibts da noch tricks die ich befolgen kann?
Nein, es gibt keine funktioniert_in_jedem_fall()-Funktion. Das Skript sollte z.B. bei jedem Start erkennen, ob es das vorige mal korrekt beendet worden ist und entsprechend reagieren.

Sollte man generell kein set_time_limit verwenden?
Nein, aber du musst dir bewusst sein, dass es deaktiviert sein kann.

Wenn ja, werd ich das natürlich umbauen, wie wäre es sinnvoll?
Das kommt drauf an, was dein Skript genau macht. Führt es eine Reihe von Aktionen aus, kann man zwischen jeder davon in einer Datei oder in der DB festhalten, bis zu welcher Position man gekommen ist. Und am Skriptanfang fragt man diese Position ab, um an derselben oder der nächsten weiterzumachen.
0 Punkte
Beantwortet von
Vielen Dank für die Tipps...hab jetzt in die Cronjobs eine Funktion mit Hilfe von register_shutdown_function eingebaut und es scheint nun alles ordnungsgemäß durchzulaufen. Danke!
0 Punkte
Beantwortet von
Nachtrag: ich bin beim bearbeiten des cronjobs und bei der suche im internet auf einen beitrag gestoßen, wie man allgemein sicherer programmieren kann. Dort wurde der Tipp nahegelegt, wichtige Konfigurationsdateien innerhalb eines ORdners mit htaccess zu schützen (Deny From all).
Leider krieg ich dann beim Ausführen der Cronjobs folgenden Fehler:
PHP Fatal error: require(): Failed opening required '../includes/config.inc.php'
Die Cronjobs werden per php -f ausgeführt, wenn ich sie mit wget -q ausführe, funktionieren Sie.

Den Tipp hab ich übrigens von dieser Seite:
http://www.peterkropff.de/tutorials/sicher_programmieren/desinformation.htm

Könnt ihr mir da auch noch helfen?
Generell macht es ja tatsächlich Sinn, so wichtige Ordner zu schützen oder?

Gruß
...