Maximum execution time ...
FrankieB
- php
Hallo,
bei der Auswertung von vielen (einigen Tausend) URLs mittels fsockopen() innerhalb einer Schleife bekomme ich (logischerweise) irgendwann mal einen timeout-Fehler:
"Maximum execution time of 30 seconds exceeded in ..."
Ja, ich weiß: mit set_time_limit() und/oder asynchroner Verarbeitung mittels cronjobs kann man das auch lösen. Wäre aber für mich nur ein "Notnagel".
Ich suche also eine Lösung, welche ohne cronjobs und Veränderung von set_time_limit() läuft.
Mir ist noch nicht ganz klar, ab wann die "execution time" beginnt und mit welchen Mitteln man einen "Neustart" eines Skripts erzwingen kann.
Meine derzeitige Idee ist, an einer geeigneten Stelle die abgelaufene (Skript-)Zeit abzufragen, und bei Bedarf das Script (selbst) neu aufzurufen.
Meine Fragen:
Ist mein Ansatz sinnvoll?
Und wenn nicht: Wer kennt nützliche Alternativen?
Danke für eure nützlichen Ratschläge.
Grüsse
Frankie
Hello,
nee, set_time_limit(0) ist schon Dein Freund. Aber Du musst das Script dann selbst überwachen, und Dir auf jeden Fall die PID merken. AUßerdem wirst Du ignore_user_abort() benötigen, wenn das Script auch ohne Browserfenster weiterlaufen soll.
Da Du dir die PID in einer Kontrolldatei merkst, kannst Du dann auch nach Schließen des startenden Browserfensters immer wieder nachgucken, ob der Prozess noch läuft und welche Kontrollmarken (Zähler, Logs etc.) er bisher erstellt hat.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Moin FrankieB,
Ich suche also eine Lösung, welche ohne cronjobs und Veränderung von set_time_limit() läuft.
ich gehe mal davon aus, dass dein Server ein Linux oder Unix Server ist, sonst hättset du wohl nicht den Cronjob erwähnt.
Ich habe das so gelöst. Job startet alle 15 min. Im Job abfagen, läufst du schon 10 min, wenn ja kill dich. Merken: was hat der Job bis dahin erledigt.
Ob, anstatt des Kills, ein neuer Aufruf des Scripts vom Script den Timeout zurücksetzt wäre prüfenswert.
Grüsse
Mike
Hallo Mike,
ich gehe mal davon aus, dass dein Server ein Linux oder Unix Server ist, sonst hättset du wohl nicht den Cronjob erwähnt.
deine Annahme ist leider nicht ganz richtig. Ich die Möglichkeit cronjobs zu nutzen habe nur bei meinem Provider, nicht aber lokal (w2k).
Da mein "timeout"-Problem im Zusammenhang mit der Verwaltung (Überprüfung) meiner Bookmarks auftritt, muß das lokal laufen, und daher ohne cronjobs. Hochsetzen von set_time_limit() möchte ich nur wegen diesem Skript tunlichst vermeiden.
Meine derzeitige "Zwischenlösung":
An geeigneten Stellen überprüfe ich die bereits abgelaufene Ausführungszeit und rufe das Skript selbst wieder auf. Als Parameter werden die aktuellen Zeiger mit übergeben und die Bearbeitung an der "Abbruchstelle" fortgesetzt.
In etwa so:
if (getmicrotimeDiff($timeStart) > $kritische_zeit) {
header("Location: http://localhost/__1_beta/test/bookmarks_check.php?start_dir=".$k."&start_file=".$k1."&counter=".$counter);
}
Wobei $kritische_zeit ausreichend geringer gewählt ist als die max. Ausführungszeit.
Das funktioniert soweit ganz gut. Einzig derzeit für mich erkennbare Nachteil ist, daß ich wg. header() keinen Satusbericht zum Verlauf/Stand ausgeben kann. Vielleicht finde ich aber auch noch eine Lösung dazu.
Grüsse
Frankie