T-Rex: PHP Speicher Behandlung

Moin,

Hab gerade ein Script ausgeführt das auf unserem Server einen "fatal Error - Memory Size". Hervorgerufen hat. Ergo der Speicher ist übergelaufen. Die Lösung für das Problem soll hier erstmal nicht Thematisiert werden.
Das hat mich auf jeden Fall gezwungen mich mit dem Thema Speicher generell mal auseinander zu setzen. Meine Lieblingsfunktion aktuell ist "memory_get_usage()".

Jetzt hab ich einen Effekt, denn ich nicht verstehe.
Local ist bei mir ein Xampp unter Windows installiert (PHP 5.3.5). Online läuft PHP 5.3.18 als CGI-Dings unter Linux. Am Anfang des Scriptes wird online doppelt so viel Speicher belegt als offline. Am Ende des Scriptes ist es sogar 10 mal mehr. Die Daten, die geladen und behandelt werden, sind ungefähr die gleichen (Datenbank Synchronisation von online nach offline).

Wenn es halt nur ein paar Bytes mehr wären... aber 10 mal mehr... hmpf.

Meine Vermutung ist, dass irgendein Apache Plugin da enorm Speicher belegt.
Oder doch irgendwas, dass man in der php.ini einstellt?

Gibt es vielleicht eine Funktion die den Speicher säubert?
Gibt es gute Tipps und Tricks Speicher schonend zu programmieren?

Mir ist bewusst, dass meine Angaben etwas Waage sind. Mir geht es wie so oft nur um Ideen.

Gruß
der Speicherbelastungstester
T-Rex

  1. Hallo,

    tut mir leid, dass ich zu Deinem Speicherproblem nix beitragen kann, aber

    Mir ist bewusst, dass meine Angaben etwas Waage sind.

    was hast du eigentlich gegen das schöne Wort "vage"?

    Gruß
    Kalk

    1. was hast du eigentlich gegen das schöne Wort "vage"?

      Ich hoffe du konntest meinen Text auch mit diesem Rechtschreibfehler lesen und verstehen. Denn das ist das wichtigste an einer Sprache -> Informationsaustausch.

      Gruß
      Anti-Politiker
      T-Rex

      1. Hallo,

        Ich hoffe du konntest meinen Text auch mit diesem Rechtschreibfehler lesen und verstehen. Denn das ist das wichtigste an einer Sprache -> Informationsaustausch.

        Nein, leider konnte ich das nicht so gut. Ich bin so eine Art umgekehrter Legastheniker: wenn Fehler im Text sind, lenken die mich total ab, führen zu interessanten Assoziationen usw.

        Sprache für Informationsaustausch zu verwenden, funktioniert umso besser, je genauer sich Sender und Empfänger an die entsprechenden Konventionen halten.

        Dafür bin ich ein recht guter Korrekturleser...

        Gruß
        Kalk

  2. Tach!

    Local ist bei mir ein Xampp unter Windows installiert (PHP 5.3.5). Online läuft PHP 5.3.18 als CGI-Dings unter Linux. Am Anfang des Scriptes wird online doppelt so viel Speicher belegt als offline. Am Ende des Scriptes ist es sogar 10 mal mehr. Die Daten, die geladen und behandelt werden, sind ungefähr die gleichen (Datenbank Synchronisation von online nach offline).

    Du vergleichst nicht nur zwei unterschiedliche PHP-Versionen (auch wenn die Unterschiede vielleicht nicht so groß sind), sondern auch noch unter zwei Betriebssystemen. Da gibt es durchaus Unterschiede in der Speicherverwaltung. Und sei es nur, dass das eine ein 32-Bit- und das andere ein 64-Bit-System ist.

    Meine Vermutung ist, dass irgendein Apache Plugin da enorm Speicher belegt.

    Die interessieren bei (F)CGI nicht. Außerdem ist PHP nur _ein_ Apache-Modul. Und obendrein liefert memory_get_usage() nur den Verbrauch deines Scripts.

    Gibt es vielleicht eine Funktion die den Speicher säubert?

    die() und exit() :-)

    Gelegentlich auch diverse close- oder free_result-Funktionen.

    Gibt es gute Tipps und Tricks Speicher schonend zu programmieren?

    SELECT COUNT(*) statt SELECT * mit mysql_num_rows(). Jedes mysql(i)_query() lädt im Hintergrund bereits alle Datensätze in den Client.

    dedlfix.

  3. Wie viel Speicher sind für ein normales PHP Script okay?

    Für eine unserer Seiten hab ich das mal getestet. Da belegt PHP 14 MB des Speichers beim Peak (memory_get_peak_usage())

    Ist das viel, vertretbar?

    Gruß
    der Speicherspitzentester und Posting Kopierer
    T-Rex

    1. Tach!

      Wie viel Speicher sind für ein normales PHP Script okay?

      Definiere "normal"! Schon ein Dreizeiler, der eine große Datenmenge aus einer Datenbank abfragt, braucht mehr Speicher als ein deutlich größeres Script das ein ganzes Affenformular erstellt. Auch Grafikbearbeitung verbraucht bei wenig (PHP-)Aufwand viel Speicher.

      Für eine unserer Seiten hab ich das mal getestet. Da belegt PHP 14 MB des Speichers beim Peak (memory_get_peak_usage())
      Ist das viel, vertretbar?

      Vertretbar kommt immer auf die Aufgabenstellung an. 128 MB ist der Default-Wert für das memory_limit. Bei 5.2 war es 16 MB und davor 8 MB. Die letzteren beiden Werte erscheinen mir recht wenig. Die 128M erscheinen einem Massenhoster vielleicht deutlich zu viel, der kann bei seinen Preisen nur Käfighaltung auf engstem Raum betreiben.

      dedlfix.

      1. Definiere "normal"!

        Sagen wir mal ein normaler Blog. Der hier z.B. http://www.phpgangsta.de/

        Mir geht es nicht um die Zeilen in PHP, sondern eben nur um die Cache Belegung. Wenn man z.B. die komplette Datenbank einliest und als Variable( Array oder Objekt) bereithält wird der Cache vermutlich explodieren.

        Gruß
        Explosionsgefährdeter
        T-Rex

    2. Ist das viel, vertretbar?

      Das kommt wie immer auf die Umstände an. Zu den Umständen hast Du uns aber nichts mitgeteilt.

      Jörg Reinholz

  4. Hi T,

    Meine Vermutung ist, dass irgendein Apache Plugin da enorm Speicher belegt.
    Oder doch irgendwas, dass man in der php.ini einstellt?

    Schuss ins Blaue: die aktivierten PHP-Erweiterungen, ein Debugger oder auto_prepend_file

    Wenn es das nicht ist, dann liegt es wie dedlfix schon sagte an der Architektur (32Bit vs 64Bit) oder halt schlicht und einfach an der unterschiedlichen Version.

    Viele Grüße,
      ~ Dennis.