speicherüberläufe in der dateiverwaltung
Verfasst: Mi 15. Jun 2005, 09:50
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.
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.