Sehr lange Skriptlaufzeit ermöglichen

LongDonJohn

Mitglied
Hallo zusammen,

ich habe ein Script, dass täglich per Cronjob aufgerufen wird und eine große Menge Daten verarbeiten muss. Mittlerweile habe ich die max_execution_time auf 5000 raufgesetzt, aber das reicht auch schon nicht mehr und weiter möchte ich nicht gehen, da die Daten irgendwann so viel sind, dass das Script Stunden laufen wird. Dabei wird immer ein Datensatz aus der Datenbank gelesen und dann die Daten verarbeitet. Laufzeit für einen Datensatz etwa 5 - 50 Sekunden.

Also habe ich mir ich mir folgendes überlegt. Nach fertiger Abarbeitung des ersten Datensatzes leite ich das Script per header auf sich selbst mit einer Zählervariablen, so dass beim nächsten Aufruf der zweite Datensatz bearbeitet wird usw.

Das funktioniert soweit auch super, allerdings scheint beim erneuten Aufruf die execution_time nicht auf Null gesetzt zu werden, wie ich erhofft hatte, sondern einfach weiter zu laufen.

Funktioniert mein Ansatz prinzipiell nicht, oder muss ich dabei was Wichtiges beachten? Oder gibt es da eine elegantere Lösung?

Gruß
John
 
Du wirst in deinem Script irgendwo eine While() schleife haben die die Dateien verarbeitet. Füge genau dort ein set_time_limit(30) ein oder dergleichen. Jedes mal wenn er hier drüber läuft wird der Timer erneut auf 30 sekunden gesetzt.

Des weiteren könntest du die Verarbeiteten Datensätze als solche Flaggen um sie nicht ein 2. mal zu verarbeiten

Aber so lange scriptlaufzeiten, wenn sich das wirklich nicht optimieren lässt dann muss es wohl so sein. Bei meinem letzten Arbeitgeber hatten wir 2 Crons auf 2 verschiedenen Server mit jeweils ~ 12 bis 14 Stunden Laufzeiten. Schneller wird es durch das erneute aufrufen ja nicht.
 
Zuletzt bearbeitet:
Es wird kein Datensatz zweimal bearbeitet - flaggen brauche ich also nicht. Es soll auch nicht schneller gehen - der Code ist so weit wie möglich optimiert. Ich möchte einfach verhindern, dass die max_execution_time den Lauf nicht abbricht, ohne den Wert dafür hochzusetzen.

Wenn ich die Beschreibung für set_time_limit() richtig verstanden habe, dann setzt das den Zähler bei jedem Aufruf wieder auf Null und das Script müsste durchlaufen ohne abzubrechen und ich könnte mir den Schritt mit der Header-Weiterleitung sparen, oder bin ich da jetzt auf dem Holzweg?
 
Richtig. Dadurch wird der Timer resettet. Und der Timer erweitert sich dynamisch anhand der Anzahl der zu bearbeitenden Datensätze.

Das script bricht höchtens dann ab wenn ein einzelner Datensatz über der im dem time_limit angegebenen Zeit benötigt.
 

Neue Beiträge

Zurück