Ich nutze Contenido 4.4.5 und habe bei einem Kunden mit mehreren hundert Dateien in der
Dateiverwaltung Speicher-Überlauf-Fehler erhalten. Schuld daran ist die Datei
/contenido/classes/classes.template.php. In der php.ini ist das memory_limit meines Wissens 8MB, was eigentlich OK ist!
Ich habe diese Datei nun überarbeitet. Folgende Dinge habe ich verändert:
-Ich habe rigoros auf reguläre Ausdrücke (Perl-kompatibel) umgestellt. Das bringt deutlich
Geschwindigkeit und spart eine Menge Code und Variablen. Der vorhandene Code war
doch etwas abenteuerlich. Ich kann nur empfehlen die Abschnitte über "Perl-kompatible
reguläre Ausdrücke" in der PHP-Doku und zusätzlich die manpage "perlre" gründlich
zu lesen.
-Ich habe sämtliche Variablen-Übergaben per Referenz bzw. Zeiger gelöst. Dann müssen
nämlich nicht Kopien erzeugt werden.
-Ich arbeite sequentiell. Die Funktion replacei18n wird nun für dynamische Blöcke immer
blockweise aufgerufen. Dann müssen bei der Abarbeitung der regulären Ausdrücke
keine Monsterkopien im Speicher erzeugt werden, sondern es wird mit kompakten Schnippseln
gearbeitet. Das könnte langsamer sein, hat aber die Funktion des Skripts wiederhergestellt.
-Ich habe allegemein den Code aufgeräumt. Außerdem lösche ich sämtliche Variablen nach
Gebrauch per unset() oder durch Zuweisung von null. Das spart Speicher.
Ein schöner Nebeneffekt ist neben der Behebung möglicher Speicherüberläufe, das das
Gesamtsystem, da es ja komplett auf Templates basiert, schneller geworden ist.
Ich habe den Code unter
http://www.handgestrickt.biz/classes.template.php.zip
abgelegt.
speicherüberläufe in der dateiverwaltung
-
- Beiträge: 40
- Registriert: Mi 15. Jun 2005, 09:40
- Wohnort: Schwerte
- Kontaktdaten:
intressant gemacht...
hab das gerade etwas getestet...
läuft anstandslos...
eine blöde frage hab ich dennoch
ein einmaliger aufruf nach der if schleife von
$this->replacei18n($content, "i18n");
$this->replacei18n($content, "trans");
benötigt so viel speicherplatz ?
hab das gerade etwas getestet...
läuft anstandslos...
eine blöde frage hab ich dennoch
ein einmaliger aufruf nach der if schleife von
$this->replacei18n($content, "i18n");
$this->replacei18n($content, "trans");
benötigt so viel speicherplatz ?
*** make your own tools (wishlist :: thx)
-
- Beiträge: 40
- Registriert: Mi 15. Jun 2005, 09:40
- Wohnort: Schwerte
- Kontaktdaten:
Hallo emergence,
Scheinbar!
Ich habe das vorher nicht sequentiell gemacht und Speicherüberläufe erhalten.
Mit sequentiellem Aufruf (also pro dynamischem Block) bekomme
ich keine Fehler mehr und das Ganze läuft selbst bei hunderten Dateien
sehr schnell.
Ich erkläre mir das so, daß bei den regulären Ausdrücken im Speicher ja
auch immer Kopien erzeugt werden. bei großen Inhalten und mehreren Backtrackings
etc. scheint das dann sehr viel Speicher zu verbrauchen.
Das Gleiche war im Übrigen auch bei str_replace zu beobachten.
Deshalb mache ich das jetzt mit jedem kleinen Block-Schnippsel gesondert, also
sequentiell. Das mag vielleicht die Laufzeit des Skriptes erhöhen. Ist aber immer noch
besser als ein Speicherüberlauf. Und 6 Sekunden Skriptlaufzeit muss man erstmal
schaffen.
Bis dann, Stefan
Scheinbar!
Ich habe das vorher nicht sequentiell gemacht und Speicherüberläufe erhalten.
Mit sequentiellem Aufruf (also pro dynamischem Block) bekomme
ich keine Fehler mehr und das Ganze läuft selbst bei hunderten Dateien
sehr schnell.
Ich erkläre mir das so, daß bei den regulären Ausdrücken im Speicher ja
auch immer Kopien erzeugt werden. bei großen Inhalten und mehreren Backtrackings
etc. scheint das dann sehr viel Speicher zu verbrauchen.
Das Gleiche war im Übrigen auch bei str_replace zu beobachten.
Deshalb mache ich das jetzt mit jedem kleinen Block-Schnippsel gesondert, also
sequentiell. Das mag vielleicht die Laufzeit des Skriptes erhöhen. Ist aber immer noch
besser als ein Speicherüberlauf. Und 6 Sekunden Skriptlaufzeit muss man erstmal
schaffen.

Bis dann, Stefan
ich hab das jetzt mal scherzhalber getestet und einen string mit ca 7,9mb erzeugt und dann einmalig das replacei18n drüberlaufen lassen...
ähm das ging ohne probleme...
3400 dateien ->
Rendering this page took: 27.6736462116 seconds
Building the complete page took: 28.9598271847 seconds
das der explorer bei 8mb html fast abgestürzt ist versteht sich von selbst...
na wie auch immer, gute arbeit...
ähm das ging ohne probleme...
3400 dateien ->
Rendering this page took: 27.6736462116 seconds
Building the complete page took: 28.9598271847 seconds
das der explorer bei 8mb html fast abgestürzt ist versteht sich von selbst...
na wie auch immer, gute arbeit...
*** make your own tools (wishlist :: thx)
-
- Beiträge: 40
- Registriert: Mi 15. Jun 2005, 09:40
- Wohnort: Schwerte
- Kontaktdaten:
Entschuldige,
Ich habe mich etwas unklar ausgedrückt. Nicht der Browser ist abgestürzt.
Ich habe hier ein Gig Speicher! Das PHP hat ein "memory_limit"
voreingestellt, was meines Wissens meistens auf 8MB steht. Wenn diese
Speichermenge von einem Skript überschritten wird, bricht PHP mit einer
Fehlermeldung im Stil "maximum memory exceeded" (oder so ähnlich) ab.
Genau diesen Fehler habe ich verhindern wollen. Natürlich könnte ich auf
meinem root-Server einfach den Speicher höher stellen. Aber nach 100
Dateien bekomme ich das Gleiche in grün. Abgesehen davon haben Leute
die "normal" hosten Pech gehabt.
Bis dann, Stefan
Ich habe mich etwas unklar ausgedrückt. Nicht der Browser ist abgestürzt.
Ich habe hier ein Gig Speicher! Das PHP hat ein "memory_limit"
voreingestellt, was meines Wissens meistens auf 8MB steht. Wenn diese
Speichermenge von einem Skript überschritten wird, bricht PHP mit einer
Fehlermeldung im Stil "maximum memory exceeded" (oder so ähnlich) ab.
Genau diesen Fehler habe ich verhindern wollen. Natürlich könnte ich auf
meinem root-Server einfach den Speicher höher stellen. Aber nach 100
Dateien bekomme ich das Gleiche in grün. Abgesehen davon haben Leute
die "normal" hosten Pech gehabt.
Bis dann, Stefan
schon klar...stefan25376 hat geschrieben:Das PHP hat ein "memory_limit"
voreingestellt, was meines Wissens meistens auf 8MB steht. Wenn diese
Speichermenge von einem Skript überschritten wird, bricht PHP mit einer
Fehlermeldung im Stil "maximum memory exceeded" (oder so ähnlich) ab.
das mit dem browser war ne erwähnung nebenbei wert

*** make your own tools (wishlist :: thx)
ich bin das letzte mal auf ein problem gestossen, welches in der contenido klasse nicht auftritt.
einfach zu reproduzieren
zb modul input oder output
man schreib etwas wie folgendes in den input und speichert
als ergebniss nach dem speichern erhält man
na wie auch immer...
ich denke die lösung für das problem müsste sein
den i18n, trans übersetzungsteil der klasse direkt nach dem laden des templates vorzunehmen...
einfach zu reproduzieren
zb modul input oder output
man schreib etwas wie folgendes in den input und speichert
Code: Alles auswählen
i18n('TEST')
Code: Alles auswählen
TEST
ich denke die lösung für das problem müsste sein
den i18n, trans übersetzungsteil der klasse direkt nach dem laden des templates vorzunehmen...
*** make your own tools (wishlist :: thx)