php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 05.07.2011, 17:56  
Neuer Benutzer
 
Registriert seit: 05.07.2011
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
Fragensteller befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Objekte Rekursiv zerstören

Hi Leute,
mal eine eine Frage unter uns^^

Unsaubere Scripte gibt es ja viele und im nach hinein alles sauber machen ist mühsam.
Nun bin ich aber auf eine solches Ding gestoßen, das auch noch schnellst möglich laufen muss.

Und zwar verursacht das Script einen MemoryLeak, da einfach zu viele Objekte erzeugt werden und der Speicher voll ist. (2 GB RAM)

Beim dritten kompletten Durchlauf ist einfach ende und es hilft nur noch ein reboot.

Leider gibt es in den Klassen keine destruktoren, hat sich mein Vorgänger nicht drum gekümmert.

Das einzige was mir nun bleibt, ist das Hauptobjekt rekursiv zu durchwandern und von hinten dann jedes Objekt auf NULL setzten um den Speicher frei zu geben.

Vielleicht aber gibt es einen anderen, besseren Weg? (ohne jede Klasse um den __destruct() zu erweitern?)
Soll auch nur eine Flicklösung sein, bis die Zeit da ist, alles in Ruhe anzupassen.

Würde mich über ein paar Antworten und Lösungen freuen.

Timo
Fragensteller ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 05.07.2011, 18:00  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Wenn der Speicher voll ist, dann ist das Konzept unsauber. Destruktoren benutz ich nicht, weil PHP das Freigeben des Speichers eleganter und wahrscheinlich auch effizienter kann.

Evtl. kannst du das Fliegengewichtpattern benutzen um die Zahl deiner Objekte gering zu halten? Oder, bei solchen gewaltigen Mengen (2GB RAM) evtl. überlegen, ganz auf Objekte zu verzichten.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 05.07.2011, 18:59  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Eine Script-Instanz hat bei dir die möglichkeit 2000 MB Arbeitsspeicher zu benutzen ? Maschinen-Overkill nenn ich sowas.. Ich fürchte bei deinem Problem hilft nur ein sauberer Rebuild des Scriptes und wenn du wirklich 2GB Speicher zur Verfügung stellst, wie Chriz schon sagte, der Verzicht auf Objekte.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist gerade online   Mit Zitat antworten
Alt 05.07.2011, 19:34  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Wo du von rekursiven Objektstrukturen sprichst: Kann es sein dass das Skript auf PHP 5.2 läuft? Dann hilft dir vielleicht schon ein Upgrade, siehe hier
fab ist offline   Mit Zitat antworten
Alt 05.07.2011, 19:39  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

„MemoryLeak“ klingt mir nach PHP-Bug. Nach Scriptende sollte der Speicher freigegeben werden. Version upgraden?

Zitat:
Leider gibt es in den Klassen keine destruktoren, hat sich mein Vorgänger nicht drum gekümmert.
Die sind bei Sprachen mit Garbage Collection eigentlich in der Regel auch nicht notwendig. Zumindest nicht, um den Speicher jeweiliger Kindinstanzen freizugeben.

Zitat:
Das einzige was mir nun bleibt, ist das Hauptobjekt rekursiv zu durchwandern und von hinten dann jedes Objekt auf NULL setzten um den Speicher frei zu geben.
Das hilft allerdings auch nur, wenn nicht an anderer Stelle noch Verweise auf die Objekte bestehen.
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (05.07.2011 um 19:53 Uhr). Grund: „Referenzen“ durch „Verweise“ ersetzt
mermshaus ist offline   Mit Zitat antworten
Alt 05.07.2011, 19:53  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Wiedermal das übliche Mißverständnis würde ich sagen. Destruktoren zerstören nicht das Objekt. Genausowenig wie Konstruktoren eines erzeugen.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 05.07.2011, 20:21  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Bei Sprachen ohne Garbage Collector dienen die Destruktoren dazu, alle „Ressourcen“ eines Objekts (grob: Instanzvariablen, die Objekte halten) freizugeben. Etwa in Delphi 6/7 (anderen Background habe ich da nicht ) ist es normale Vorgehensweise, Objektbäume durch geschachtelte Destruktoraufrufe „abzuräumen“. In Sprachen der C-Familie sicherlich auch.

Hier ist der Ansatz des Frage(n)stellers wohl, diese Technik auch in PHP anzuwenden. Das mag ein Verständnisfehler sein oder auch der Versuch, den Speicher zu leeren, weil der Garbage Collector/der PHP-Interpreter es – wieso auch immer – nicht hinkriegt.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 06.07.2011, 13:52  
Neuer Benutzer
 
Registriert seit: 05.07.2011
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
Fragensteller befindet sich auf einem aufstrebenden Ast
Standard

hi, wow das ging ja mal schnell.
Werde mich gleich mal mit den tips auseinander setzten.

Ja, es läuft PPH 5.2.


Hm,. ok, dann habe ich das mit dem Destruktoren und Konstruktoren wirklich falsch verstanden. Mist.

Würde das Script gerne neu machen aber die Zeit bis es laufen muss ist zu knapp.
Ist aber geplant, denn wie schon einige sagen, es ist einfach unsauber.

Ich melde mich wieder, wenn ich ein Ergebnis habe....

Schon mal Danke für die erste hilfe.
Fragensteller ist offline   Mit Zitat antworten
Alt 06.07.2011, 15:31  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
Bei Sprachen ohne Garbage Collector dienen die Destruktoren dazu, alle „Ressourcen“ eines Objekts (grob: Instanzvariablen, die Objekte halten) freizugeben. Etwa in Delphi 6/7 (anderen Background habe ich da nicht )
Ist auch in neueren Delphis so. Oder man verwendet halt TComponent statt TObject, dann wird der Speicher der Kindklassen automatisch freigegeben.


Ein unset kann Sinn machen, wenn man den Speicher braucht bevor der Request fertig abgearbeitet ist. Aber wenn der Speicher nach dem Ende des Requests nicht freigegeben wird, dann liegt das Problem woanders.
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 06.07.2011, 16:07  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

die Frage wäre eher - DARF dein PHP überhaupt die 2gbyte nutzen ?.. ME steht doch laut phpinfo() meist nur 256 mb - oder sogar nur 128 mb für PHP"Daten" zur Verfügung ....

vielleicht hilft dir ja in deinem Fall neben dem Upgrade auf 5.3 auch eine Änderung dieser php.ini- Einstellung
Code:
memory_limit	128M      128M
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Array aus SQL Abfrage zusammenbauen um es rekursiv abzuarbeiten litterauspirna PHP Einsteiger 7 01.02.2011 18:44
Objekte mit Attributen variabler Anzahl und variablen Typs speichern Bergtroll Datenbanken 9 29.01.2011 14:54
[Erledigt] Zerstörung der Objekte am Ende eines Scripts ByStones PHP Tipps 2010 8 03.05.2010 14:01
[Erledigt] Browsergame : Objekte auf einer Karte BlackScorp Software-Design 10 01.04.2010 09:59
Verschachtelte Objekte und Vererbung GELight PHP-Fortgeschrittene 1 11.12.2009 09:09
Was bringt OOP wenn Objekte nach jeder Seite sterben? majorbenks PHP Tipps 2009 9 18.11.2009 14:11
[Erledigt] Referenzen auf Objekte innerhalb eines Arrays PHP-Fortgeschrittene 6 31.08.2009 17:06
[Erledigt] Wo liegen bei OOP die Objekte? Jafix PHP Tipps 2009 2 12.06.2009 18:14
[Erledigt] Objekte übergeben Felix PHP Tipps 2008 23 18.06.2008 12:21
Objekte zerstören galaxyshadow PHP Tipps 2008 4 12.05.2008 10:29
Objekte zur Laufzeit Vererbung anhängen Zergling-new PHP-Fortgeschrittene 8 17.11.2007 17:31
[Erledigt] Objekte vergleichen PHP-Fortgeschrittene 4 08.12.2005 16:20
Ganze Objekte an Script weitergeben dreamingof8a PHP Tipps 2004-2 6 23.11.2004 12:17
[Erledigt] Referenzen auf Objekte PHP-Fortgeschrittene 2 17.08.2004 11:08
Anonyme Objekte? PHP-Fortgeschrittene 18 25.07.2004 22:19

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php objekt zerstören, speicher freigeben in c bei rekursion, php mit new erzeugte objekte zerstören?, php 5.3 garbage collector rekursion, php nach scriptende wird speicher nicht freigegeben, cpp rekrusive klasse speicher freigeben, objekt zerstören php, objekte rekursion, rekursion bei objekte, php rekursive opjekt, php speicher freigeben klasse, php garbage collector 2011, delphi baum freigeben, wo speichert msn freigegeben objekte ?

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:59 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum