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