Möglichkeit für lange Scriptlaufzeiten ohne set_time_limit()
Horst Nogajski
- php
Hallo zusammen,
da ich leider nur über PHP im Safemode verfüge fällt immer nach 30 Sekunden scriptlaufzeit gnadenlos der Hammer, und set_time_limit($sec) wird im Safemode ignoriert.
Gibt es Möglichkeiten ein Script das zwischen 30 und 120 Sekunden bräuchte so zu gestalten das man trotzdem alles abarbeiten kann, (vielleicht in mehreren Schritten).
Das Script scannt Verzeichnissse und erstellt evtl. Thumbnails.
Es ist nicht öffentlich zugänglich, sondern wird nur hin und wieder von mir aufgerufen nachdem ich Änderungen an meiner Seite vorgenommen habe.
Für Anregungen, Ideen, Hinweise usw. schon mal vielen Dank im voraus,
Horst
Moin!
Gibt es Möglichkeiten ein Script das zwischen 30 und 120 Sekunden bräuchte so zu gestalten das man trotzdem alles abarbeiten kann, (vielleicht in mehreren Schritten).
Grundsätzlich ja. Allerdings: Wenn dein Skript für elementare Operationen zu lange benötigt, wird auch dies unmöglich sein.
Das Script scannt Verzeichnissse und erstellt evtl. Thumbnails.
Es ist nicht öffentlich zugänglich, sondern wird nur hin und wieder von mir aufgerufen nachdem ich Änderungen an meiner Seite vorgenommen habe.
Es wäre ja (Stufe 1) grundsätzlich möglich, dass dein Skript jeweils nur ein einziges Verzeichnis scannt und für jede Aufgabe, die zu erledigen ist (derer gibt es 2: Erstens ein Unterverzeichnis scannen, zweitens ein Thumbnail erstellen), einen Link als HTML-Seite ausgibt, dem du mit deinem Browser folgen kannst.
Als weitergehende Stufe 2 wäre es dann möglich, den manuellen Linkaufruf zu automatisieren, indem du auf Javascript zurückgreifst. Damit verlagerst du einen Teil der Aufgabe in deinen Browser.
Die Sache ließe sich natürlich auch noch zusammenfassen: Wenn dein Skript es in seiner Laufzeit schafft, deine gesamte Verzeichnisstruktur zu scannen und Links für Thumbnails auszugeben, dann fällt die eine Aufgabe schon mal flach. Und die entstehende Liste ließe sich als Javascript grundsätzlich in entweder beliebig vielen Popups abarbeiten (das ist dann die Mega-Performanceattacke auf deinen Server), oder nacheinander (vielleicht in einem Frameset: Oben rotiert ein Javascript durch ein Array von aufzurufenden Links, und unten wird die jeweilige Erfolgsseite dafür sorgen, dass oben das Skript weitermacht.
- Sven Rautenberg
Hallo!
Gibt es Möglichkeiten ein Script das zwischen 30 und 120 Sekunden bräuchte so zu gestalten das man trotzdem alles abarbeiten kann, (vielleicht in mehreren Schritten).
Aufteilen ist wohl das beste.
Vielleicht liegt es aber auch an der Programmierung, weshalb es so lange benötigt.
Das Script scannt Verzeichnissse und erstellt evtl. Thumbnails.
Du kannst Dir ja im ersten Schritt einen Überblick über die Verzeichnisstruktur machen und temporär speichern und dann in weiteren Schritten die Verzeichnisse und Inhalt abarbeiten.
Hallo Horst
max_execution_time () könnte helfen.
Das Tutorial sagt dazu folgendes:
<zitat>
...dass set_time_limit() in safe mode nicht benutzt werden kann. Verwenden Sie die Konfigurationsoption max_execution_time, um diese
</zitat>
Fertig sieht die SAache dann so aus:
ini_set('max_execution_time','180');
Ungetestet, dürfte aber klappen.
Viele Grüße aus Berlin
TomIRL
Moin Horst,
Gibt es Möglichkeiten ein Script das zwischen 30 und 120 Sekunden bräuchte so zu gestalten das man trotzdem alles abarbeiten kann, (vielleicht in mehreren Schritten).
Ich nehme das mal als gegeben hin, daß Du im Safe Mode den Timeout
nicht beeinflussen kannst. ( Ich bin mir da nicht sicher )
Sollte es so sein, bleibt die nur ein "gezielter Timeout".
Das Script soll sich nach 20 sec selbst beenden und einen Marker
setzen, was zuletzt bearbeitet wurde. Dort soll es dann weitermachen.
Ja nach Betriebssystem rufst Du das script, über taskmanager oder
cronjob ca. 3-4 mal auf bis der job erledigt wurde.
Ich hoffe das ist zumindest ein Ansatz
regds
Mike
Hallo Zusammen und vielen Dank für die Antworten,
ich bin ein bißchen faul und antworte mal auf alle Postings zusammen in diesem meinem einen hier, ;-)
Also zu allererst: der Vorschlag von TomIRL ist der der am einfachsten und mit dem wenigsten Aufwand umzusetzen ist. Zuerst habe ich ja befürchtet das das im Safemode auch nicht geht, ähnlich wie set_time_limit(), aber:
echo "safe_mode ist: ".(int)ini_get('safe_mode')."<br>";
echo "max_execution_time: ".ini_get('max_execution_time')."<br><br>";
ini_set('max_execution_time','180');
echo "max_execution_time nach ini_set('max_execution_time','180'): ".ini_get('max_execution_time')."<br>";
ini_restore('max_execution_time');
echo "max_execution_time nach ini_restore('max_execution_time'): ".ini_get('max_execution_time')."<br>";
=:)
Zu der Überlegung das es evtl. an der Art der Programmierung liegt kann ich beruhigt sagen das es sich bei dem Script um zwei Klassen handelt die ich selber geschrieben habe (bzw. noch schreibe), von denen die eine (fast) alle möglichen Wünsche die man beim Verzeichnis scannen haben kann erfüllt:
<stolz>optionale Parameterübergaben als Strings oder Arrays, Startverzeichnis(liste), max. Verzeichnistiefe, dateityp(enliste), subfoldername(nliste), basename(nliste), jedes als 'in' oder 'exclude', 'match any' oder 'match all', usw.</stolz>
Das Einzige was noch fehlt ist eine optionale Parameterübergabe per RegExp.
Ein Scann von Laufwerk C: meines _lokalen_ Rechners (P3 600Mhz NT4) z.B.:
über 60.000 gescannte Dateien, passende zum Suchmuster ca. 3.000, Speicherung der Infos im Array und anschliessende Ausgabe an den Browser: Dirname, Basename, Extension, FileDate, Filesize, Friendly_Filesize, URL (falls innerhalb von DocRoot), usw. > dauert ca. 19 Sekunden beim ersten Aufruf. Bei direkter Wiederholung des Scripts dauerts nur ca. 12 Sekunden (liegt wohl daran das die VerzeichnisInfos dann noch im BetriebsSystemCache liegen und kaum Festplattenzugriffe erforderlich sind).
Das Problem warum es so lange dauert ist die Erstellung der Thumbnails wenn man alle oder viele neu erstellen will.
Mit der GD2-Library erzielt man sehr gute Ergebnisse, mit der älteren 1.6x leider nicht. Deshalb verwende ich optional eine Funktion die ich im php-Manual gefunden habe welche unter zu Hilfenahme von mehreren ImageFunktionen eine Bicubic-Umrechnung zu Fuß bewerkstelligt. Die erzielt sehr gute Ergebnisse aber dauert endlos lange.
Und hier kommt der Lösungsansatz von Sven ins Spiel. Wenn man also erstmal alle Verzeichnisse scannt und eine Liste mit den zu bearbeitenden Dateien abspeichert, kann man im 2. Schritt das Script aufrufen um z.B. jeweils eine festgesetze Anzahl Dateien zu bearbeiten. Es müßte doch auch durch ein bißchen Ausprobieren möglich sein im Vorfeld grob die zur Bilderstellung benötigte Zeit anhand von Dateiformat und Dateigröße oder Bildgröße zu kalkulieren, und diesen Wert sowohl für ini_set 'max_execution_time', als auch für einen Browserrefresh mittels META-Tag zu nutzen.
So könnte ich doch evtl. auch ohne Javascript auskommen?
(Das kann ich nämlich nicht).
Während der Scriptabarbeitung könnte man mittels echo und flush Informationen ausgeben. Und natürlich gehört dann auch ein kleines Formular mit Pause-, Weiter, Abbruch-Buttons in die Datei.
Klingt echt cool soweit, jetzt muß ich es nur noch umsetzen, *g*
(hoffentlich funktioniert das auch so)
Viele Grüße,
Horst