Thread Objekt löschen (25 answers)
Opened by Froschpopo at 2007-11-12 05:38

renee
 2007-11-14 13:03
#102398 #102398
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Struppi+2007-11-14 11:36:37--
Ich hab noch nie mit mod_perl gearbeitet, aber das klingt als ob du von mod_perl abrätst?


Ich würde nicht *generell* davon abraten, aber bei mod_perl sollte man ganz genau wissen was man tut. Einem Einsteiger würde ich nicht unbedingt zu mod_perl raten. Da kann man ganz schnell in fiese Fallen tappen!

Quote
[...]
Das klingt einerseits nach einem globalen Objekt. Ist es unter mod_perl nicht sinnvoll dieses im Speicher zu halten, bzw. ist das nicht der Vorteil von mod_perl, das eben nicht immer alles neu geladen wird?

Ja, es ist ein Vorteil dass nicht alles neu geladen werden muss. Objekte sollten dennoch nicht global sein.

Ich hatte bei einem Kunden das "Problem", dass ein einziges Modul nicht "sauber" implementiert war (Objekt war global) und dadurch Fehler bei einem User erzeugt wurden, die eigentlich von einem anderen User verursacht wurden. Es sind zwar seltene Fälle (je nach Konfig des Webservers), aber stell Dir mal eine Shopanwendung, in der Kundendaten (Kreditkartennummer,etc) in einem globalen Objekt gespeichert werden. Dann kann es passieren, dass ein User Deine Daten sieht, weil er gerade den Prozess bekommt, in dem Deine Daten in einem globalen Objekt gespeichert sind...

Quote
Gleichzeitig klingt das aber wieder nicht nach einem globalen Objekt (wg. $self) und dann wird es sowieso automatisch "gelöscht" (gelöscht stimmt ja nur bedingt) wenn es nicht mehr benötigt wird.


Vorsicht vor zirkulären Referenzen! Die können bei mod_perl ganz schnell mal Memory Leaks hervorrufen... Bei einem CGI-Skript (bei jedem Request alles neu laden und ausführen) wird am Ende des Skripts alles aufgeräumt. Bei mod_perl nicht unbedingt, da ja der ApacheChild weiterlebt...

Nur weil der Gültigkeitsbereich von $self verlassen wird, heißt das nicht, dass alles dahinter "zerstört" wird. Es kann ja sein, dass noch andere Variablen eine Referenz auf die Daten von $self haben - und wenn die "global" sind, dann ist das nicht vorteilhaft.

Quote

Mir stellt sich die Frage, warum es sinnvoll sein soll ein Objekt von Hand zu löschen, dass sowieso gelöscht wird? Und selbst wenn es relativ viel speicher belegt, wird das löschen nicht unbedingt einen folgenden Prozess beschleunigen, da das löschen schon Zeit kosten kann, eher verlangsamen.


Es hat keiner behauptet, dass das Löschen von Objekten etwas beschleunigt, aber es *kann* durchaus Sinn machen, das Objekt selbst zu "zerstören" und somit den Speicher (intern) freizugeben (wenn keine anderen Referenzen auf die Daten vorhanden sind). Zum einen kann man so zirkuläre Referenzen zerstören und zum anderen kann man extrem hohen Speicherverbrauch vermeiden.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/

View full thread Objekt löschen