Mailinglisten-Archive |
ich versuch mich mal, du versuchst in dem objekt tubu das object bar zu halten und wiederrum in bar das object tubu, tubu verweißt auf bar, in der doTest methode erzeugst du jedes mal ein neues object bar meiner meinung nach ist die list in jedem object immer nur ein array mit einem value ... erster ansatz wäre dort $list auf static zu setzen damit du in jeder instance von bar die gesamte liste hast, dann wäre es sinnvoll das du dem constructor von tubu das object als reference übergibtst public function __construct(& $pObject) so solls ja auch sein denke ich mal weil p = pointer heißen wird, sonst wird das object eigentlich einfach nur kopiert, ausserdem wäre es für bar sinvoll das dies eine singleton klasse ( http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster) ) wäre, dann bräuchtest du auch nicht die liste als static setzen ... aber nun zu deiner frage warum das ding immer mehr speicher frisst die erzeugten objecte werden an keiner stelle genullt bzw. nicht mit unset raus geschmissen ... damit friss er immer mehr, php gibt glaub ich erst den speicher frei wenn keine referenz mehr auf ein object zeigt (kann mich auch irren), da du aber zwischen den klassen immer wieder neue objecte erzeugst wird nix frei gegeben .... jetzt bin ich selbst erwas verwirrt .... aber ich hoffe du kannst mit dem oberen teil etwas anfangen warum es allerdings nicht zum speicherfresser wird wenn du ein clone davorsetzt kann ich mir nicht erklären, da würde man es eigentlich erst recht vermuten Stefan Sturm schrieb: > Hallo, > > wir habe in einem größeren Projekt derzeit ein Problem mit dem > Speicherverbrauch eines Scripts. > Ich habe das Problem in einem kleineres Script reproduzieren können. > Aber vielleicht ist das ja auch ein Feature. > > Hier das Script: > > <?php > > class tubu > { > protected $object = NULL; > > public function __construct($pObject) > { > $this->object = $pObject; > } > } > > > class bar > { > protected $list = array(); > > public function __construct() > { > $this->init(); > } > > public function init() > { > $this->list[] = new tubu($this); > } > } > > class foo > { > protected $bar = NULL; > public function doTest() > { > for ($i=1; $i<100000;$i++) { > fwrite(STDOUT, "$i: " . memory_get_usage(true) . "\n"); > $this->bar = new bar(); > } > } > } > > > $foo = new foo(); > $foo->doTest(); > > ?> > > Dieses Script frisst bei jedem Druchlauf mehr Speicher. > Wenn ich in der Function init() in Klasse bar folgende Zeile verwende > ist alles OK. > $this->list[] = new tubu(clone $this); // ein clone vor das $this. > > Hat da jemand vielleicht eine Idee? > > Danke und Grüße, > Stefan Sturm >
php::bar PHP Wiki - Listenarchive