Mailinglisten-Archive |
Hi, On Friday 31 March 2006 08:07, Sebastian Mendel wrote: > >> Es sollte eigentlich automatisch passieren, aber ich würde es auch gern > >> genau wissen, von jemandem der sich mit PHP intern auskennt ... > >> Johannes? > > > > Ist Johannes im Urlaub? :-) Nein, ich lese hier bloß nicht alle Mails mit :-) Also: Das Speichermanagment von PHP ist für Scripte, die je nur ein Bruchteil einer Sekunde laufen, optimiert. D.h. im Gegensatz zu Sprachen wie Java, wo eine J2EE-Komponente durchaus einige Tage/Wochen/Monate laufen kann gibt es in PHP kein sooo ausgefiltes Memory Management. Grundsätzlich ist es so, dass der von einer Funktion benötigte Speicher am Ende dieser Funktion wieder freigegeben wird - zumindest PHP intern. Ein manueller unset am Funktionsende macht nur Sinn wenn man PHP 5 Objekte mit Destruktoren hat und die Reihenfolge der Destruktion beeinflussen will. (Wobei das natürlich nur dann gut geht wenn man die Menge der existierenden Referenzen beachtet) Der dabei freigegebene Speicher wird dabei nicht umbedingt an das System zurück gegeben, da die Engine davon ausgeht, dass sie die Standardgrößen kennt (größe einer Variable, ...) und das besser selbst verwalet, als immer kleine Blöcke vom System anzufordern und wieder freizugeben was zu ständigem umsortieren seitens des Betriebssystems führen würde. Dies führt dazu, dass "Aufräumaktionen" vom Betriebssystem (top o.ä.) nicht wahrnehmbar sind sondern nur über PHPs memory_limit-Zähl-Funktion beobachtet werden können. (Für Experimentierfreudige: Diese Verhalten kann über die configure-Option --disable-zend-memory-manager deaktiviert werden was aber nicht im geringstem [außer zum Debugging von PHP/der ZendEngine selber] empfohlen oder supportet wird) Da ich es gerade aufgerufen habe noch was zum Beispielcode des OP, auch wenn es nichts mit der Sache zu tun hat: Entsprechend der Funktionsattribute (static public) handelt es sich um PHP 5 Code.Allerdings werden Objekte per Referenz zugewiesen. Dies ist nicht empfohlen, da PHP 5 jedenfalls (so man nicht expliziet klont) auf referenzierten Objekten Arbeitet. Ergo das & in $user = &new user($uid); und der nächsten Zeile raus ;-) johannes (der heute Urlaub hat...)
php::bar PHP Wiki - Listenarchive