Arne: Garbage Collection anwerfen

Hallo liebes Forum,

Ich habe eine Schleife in einem PHP Skript in dem ein Objekt erzeugt wird und die Daten zu dem Objekt aus einer Datenbank eingelesen werden. (ca. 100KB)

In der Schleife wird nun der id3 Tag von mp3 Datein anhand der Informationen verändert.

Das Skript läuft bei unserem Provider allerdings nicht weil ziemlich schnell die 16MB Grenze Speicher überschritten sind. Und das verwundert mich, da ich am ender der Schleife mit

unset($objName) oder auch alternativ mit
$objName = null;

die Ressourcen freigebe. Und auch wenn nicht sollte ja das

$objName = new MyObj();
$objName->readData();

am Anfang der Schleife ja auch das "alte" objekt wieder überschreiben. Ich lass mit mit memory_get_usage() den benutzen Speicher ausgeben und dieser erhöht sich kontinuierlich.

Ich hab die Vermtung das die Ressorcen von php nicht freigegeben werden. Bei Java gibt es ein Befehl um die Garbage Collection anzustoßen. Gibt es so was auch bei php?

Danke u. Gruß,

ARne.

btw: Server Apache 1.3.?, php 5.0.2

  1. echo $begrüßung;

    Ich hab die Vermtung das die Ressorcen von php nicht freigegeben werden. Bei Java gibt es ein Befehl um die Garbage Collection anzustoßen. Gibt es so was auch bei php?

    Nein, ich glaube nicht. Versuch doch mal, für deinen Vorgang eine Funktion mit lokalen Variablen zu verwenden. Die, so las ich, sollen am Funktionsende freigegeben werden.

    echo "$verabschiedung $name";

    1. ...Versuch doch mal, für deinen Vorgang eine Funktion mit lokalen Variablen zu verwenden. Die, so las ich, sollen am Funktionsende freigegeben werden.

      Ja, genauso wie bei unset(); :-/

      Es würde ja auch keinen Sinn machen nicht statische Variablen, auf die nie mehr zugegriffen werden kann, im Speicher zu behalten.

      Ich habs ausprobiert und gleiches Problem. Immer noch Ausgaben wie folgt:

      CDNR: 20001
      s: 1
      t: 01

      Array
      (
          [0] => 10831 - setMP3()
          [1] => 10832 - preg_replace()
          [2] => 10832 - vergleich()
          [3] => 10832 - new CD()
          [4] => 10833 - readCD()
          [5] => 10884 - preg_replace()
          [6] => 10884 - getTrack()
          [7] => 10884 - setMp3Tag
          [8] => 10899 - close()
          [9] => 10899 - after unset()
      )

      CDNR: 20001
      s: 1
      t: 02

      Array
      (
          [0] => 10899 - setMP3()
          [1] => 10899 - preg_replace()
          [2] => 10899 - vergleich()
          [3] => 10899 - new CD()
          [4] => 10899 - readCD()
          [5] => 10948 - preg_replace()
          [6] => 10948 - getTrack()
          [7] => 10948 - setMp3Tag
          [8] => 10948 - close()
          [9] => 10948 - after unset()
      )

      CDNR: 20001
      s: 1
      t: 03

      Array
      (
          [0] => 10948 - setMP3()
          [1] => 10948 - preg_replace()
          [2] => 10948 - vergleich()
          [3] => 10948 - new CD()
          [4] => 10949 - readCD()
          [5] => 10991 - preg_replace()
          [6] => 10991 - getTrack()
          [7] => 10991 - setMp3Tag
          [8] => 10991 - close()
          [9] => 10991 - after unset()
      )

      ...

  2. Bei Java gibt es ein Befehl um die Garbage Collection anzustoßen.

    Eigentlich auch nicht. Man kann damit zwar den Wunsch äußern, daß mal aufgeräumt werden sollte. Ob das aber tatsächlich passiert, ist Sache der Umgebung.

    1. Eigentlich auch nicht. Man kann damit zwar den Wunsch äußern, daß mal aufgeräumt werden sollte. Ob das aber tatsächlich passiert, ist Sache der Umgebung.

      Und genau den Wunsch würde ich php auch gern mitteilen. System.gc() bringt in den meisten Fällen messbare Resultate.

    2. Hallo,

      Eigentlich auch nicht. Man kann damit zwar den Wunsch äußern, daß mal aufgeräumt werden sollte. Ob das aber tatsächlich passiert, ist Sache der Umgebung.

      Jein. Der JavaDoc gibt zumindest vor, daß der Garbage Collector was
      tun soll, wenn die Methode aufgerufen wird:

      "When control returns from the method call, the virtual machine has
      made its best effort to recycle all discarded objects."

      Man könnte es sogar so lesen, als müßten alle "ausrangierten" Objekte
      vollständig entfernt worden sein.

      Allerdings las ich auch schon des öfteren das, was du oben schriebst...

      Gruß
      Slyh