Hallo zusammen,
manchmal, bei größeren Datenmengen, läuft mein Script nicht durch.
Ich denke es liegt an dem gesetzten Timeout für PHP- Scripte (meist 30 Sekunden CPU- Zeit, effektiv aber nur wenige Sekunden… egal).
Andererseites werden im Script zum Teil Textvariablen mit manchmal bis zu 100 KB oder mehr zwischen etlichen Funktionen hermumgeschoben.
Wieviel Hauptspeicher dabei drauf geht weis ich nicht.
Vielleicht 1 MB … oder doppeltsoviel oder nur halb.
Wenn ich mit Pointern, also verweisen auf Speicherplätze arbeiten würde könnte ich diese Menge vielleicht vierteln oder mehr.
Glaubt Ihr das dies was nützt ? Läuft das Script dann durch oder ist wenigstens schneller ?
In der Regel sind die Timeouts für Scripte vom Provider eingestellt und lassen sich nicht einfach umbiegen.
Aber ich hatte gerade einen ähnlichen Fall in JavaScript. Natürlich bringt es etwas, wenn man solche häufigen und speicherintensiven umkopierereien vermeidet!! Auch wenn eine Stringvariable ständig benutzt wird um viele kurze Strings anzuhängen wird es schnell kritisch. (häufig der Fall, wenn die Ausgabe des PHP nochmal gepuffert wird. In so einem Fall würde ich mal das Puffern in einem File ausprobieren. Möglicherweise ist der IO schneller, als das ständige allocieren von neuem speicher & umkopieren).
Übrigens, der Begriff CPU-Zeit gibt soweit ich weiß die Zeit an für die die CPU wirklich mit deinem Prozess beschäftigt war. Wenn also die CPU-Zeit auf 30 Sekunden liegt, dann kann da real eine Laufzeit im Minutenbereich rauskommen, wenn sich gerade viele Prozesse die CPU teilen.
Danke ! Übrigens die Funktion heißt:
set_time_limit(0);
Aber leider läuft PHP bei meinem Provider im
Safemode.
Die einzige Möglichkeit, dies zu umgehen, ist den Safemode im configuration file auszuschalten, was ich nicht darf.
Eine notlösung wäre den Bearbeitunsstand zwischenzuspeichern und das Script neu über die URL aufzurufen… ist aber sicher kompliziert… habs nämlich schon mit teilerfolgen versucht.
Gruß Sebastian
Legt die Zeit in Sekunden fest, die ein Script laufen darf. Ist diese Zeit abgelaufen,
wird ein Fehler zurückgegeben. Der Standard liegt bei 30 Sekunden,
es sei denn, max_execution_time ist configuration file eingetragen.
Bei einer Einstellung von 0 Sekunden ist die maximale Ausführungszeit nicht begrenzt.
Wenn set_time_limit() aufgerufen wird, dann startet der Zähler neu.
Das heisst, wenn die Standardeinstellung 30 Sekunden beträgt und nach 25 Sekunden durch ein Script ein Aufruf wie z.B. set_time_limit(20) erfolgt, darf das Script insgesamt 45 Sekunden laufen, bevor eine Fehlermeldung ausgegeben wird.
Achtung: Wenn PHP im Safemode läuft, hat set_time_limit() keinen Effekt.
Die einzige Möglichkeit, dies zu umgehen, ist den Safemode im configuration file auszuschalten.
Re^2: Ich erreiche den Servertimout machmal
Ja den Timeout kann ich wohl nicht umbiegen(Puretec).
Ich habe jetzt festgestellt, das es anscheinend weniger mit der effizienten Speichernutzung, als vielmehr mit der Datensatzmenge (MySql-Select) und meinen damit verbundenen PHP-Funktionen zu tun hat.
Gebe ich bei 8 Datensätze alle Spalten (mediumtext etc.)
aus geht das ganz flott.
Gebe ich bei 15 Datensätze mit nur wenigen Spalten (nur varchar… aus) stoppt das Script schon bald.
a) Einmal Zeichenmenge auf „Gesamten Beitrag“ mit
Max.Anzahl „8“ stellen.
b) Und dann einmal Zeichenmenge auf „Nur Titel“ mit
Max.Anzahl „15“ stellen.
a) ist denke ich viel Speicherintensiver, zumindest siehts äußerlich so aus
b) dagegen anscheinden gar nicht. Trotzdem ist a) viel schneller.
P.S.: Das Ergebnis wird jedoch noch sehr durch einen ServerCache verfälscht. Im Fall a) wird aus dem Cache geladen im Fall b) kann noch nicht aus dem Cache geladen werden, weil der FAll noch niemals generiert wurde.
Tja auf jeden Fall wäre ein arbeiten mit Zeigern auf Speicherplatz ein besserer Programmierstiel.
Wird viel arbeit werden… puhh… was solls… bins ja gewohnt.
Hoffentlich bringts auch was.
Ich habs !
Mein Scrpt generierte ein Html-Output der ca. 1,5 MB groß war.
Das war soweit OK.
Aber am Ende durchsuchte und ersetzte es diesese riesen File noch mal… Das dauerte zu lange !