Philipp Hasenfratz: Garbage Collection zur Script Laufzeit ?

Beitrag lesen

Halihallo Andreas bzw. eher Marko

gibt es in PHP eine Möglichkeit Objekte vor dem Scriptende aus dem Speicher zu
entfernen ?

Lies mal was zu "Reference-Counting" durch: http://www.zend.com/zend/art/ref-count.php

Schön, dass PHP das "jetzt" auch kann :-)

Du musst vor allem darauf achten - gerade bei großen Objekten, dass Du die Objekte möglichst explizit als Referenz übergibst, so dass die großen Objekte nicht mehrfach im Speicher existieren.

Jep. Nur:   (@Marko)

<?php
  $t3 = Array(content => 'test');
  $t = Array( name => $t3 );
  unset($t3);
  var_dump($t);
?>

Tja, auch wenn das "array" mit content=>'test' gelöscht wird
(genauer ist es eben nur die Variable $t3, der Speicher vom Array
ist davon weitgehend unbeeinflusst), erscheint es noch bei var_dump.
Warum? - Nun, $t3 erhöht den reference counter (des Arrays!) auf 1,
die Referenz name im "Array $t" auf 2. Über unset($t3) oder $t3=NULL
wird der reference counter des ersten Arrays auf 1  decrementiert
und somit ist das Array (nicht die Variable $t3) immer noch im
Speicher. Um wirklich für den Garbage Collector zu arbeiten,
müsste man also auch $t löschen, sodass auch $t3 freigegeben wird...

Mit anderen Worten: Alle Referenzen auf eine (anonyme!) Datenstruktur
müssen (entweder Rekursiv oder direkt) gelöscht werden. Merke: Eine
Variable ist ebenfalls eine Referenz auf eine anonyme Datenstruktur.
z.B. zeigt bei '$t="hello"', die Variable $t auf eine Instanz der
Datenstruktur String, welche mit 'hello' "gefüllt" ist und somit
bereits einen reference counter von 1 aufweist.

Huch, hoffe das war in etwa verständlich :-)
Aber lieber doch Andreas verlinktes Dokument lesen :-)

Ja. http://www.php.net/unset gibt die Variable für Garbage
Collecting frei.

ich sags ja - PHP`ler, da kannste Dich gegen wehren oder nicht ;-)

We are the PHP'ler. Resistence is futile.
Until you speak Perl, I suppose! :-)

Viele Grüsse

Philipp