phpbar.de logo

Mailinglisten-Archive

[php] Memory Hole?

[php] Memory Hole?

Michael Dunkel michael.dunkel at ipoque.com
Mon Mai 18 16:57:02 CEST 2009


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