phpbar.de logo

Mailinglisten-Archive

[php] Aufräumen vor Funktionsende

[php] Aufräumen vor Funktionsende

Johannes Schlueter schlueter at phpbar.de
Fre Mar 31 12:02:12 CEST 2006


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