AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memory-Leak bei PHP

Offene Frage von "alcaeus"
Ein Thema von alcaeus · begonnen am 4. Aug 2008 · letzter Beitrag vom 5. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#1

Memory-Leak bei PHP

  Alt 4. Aug 2008, 19:23
Hallo,

ich hab ein kleines Problem mit nem MemLeak in PHP. Gegeben sei folgender Code:
Code:
$usage = array(memory_get_usage(), memory_get_usage(), memory_get_usage(), memory_get_usage());

$usage[0] = memory_get_usage();
$foo = 'bar';
$usage[1] = memory_get_usage();
unset($foo);
$usage[2] = memory_get_usage();
$foo = null;
$usage[3] = memory_get_usage();

echo "<pre>". print_r($usage, 1) ."</pre>";
Die Ausgabe ist folgende:
Code:
Array
(
    [0] => 59256
    [1] => 59344
    [2] => 59344
    [3] => 59344
)
Man sieht also, dass der Speicherverbrauch auch durch unset nicht runtergeht. Ich habs auf zig verschiedene Varianten getestet, aber der Verbrauch bleibt immer oben. Ich hab auch ausgeschlossen, dass memory_get_usage() selbst oder das Array den Verbrauch hochziehn. Nehm ich alle Anweisungen mit $foo raus, bleibt der Verbrauch konstant.

Kann mir jemand evtl. erklaeren, wie ich das Problem umgehn kann? Mir faellt sonst kein Weg ein, verwendeten Speicher wieder freizugeben, und ich stosse bei ein paar Webseiten so langsam an Kapazitaetsgrenzen

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
xSkaschY

Registriert seit: 19. Jun 2006
Ort: Bünde
95 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Memory-Leak bei PHP:

  Alt 4. Aug 2008, 19:47
Hallo,

unset(); löscht nur den Wert einer Variable genau wie NULL.

Macht sich übrigends nur bei größeren Werten bemerkbar, da die Variable ja weiterhin existiert.

Code:

echo memory_get_usage() . "\n"; // ~36640

$a = str_repeat("Hello", 4242);

echo memory_get_usage() . "\n"; // ~57960

unset($a);

echo memory_get_usage() . "\n"; // ~36744
Der Memory wird beim Scriptende automatisch wieder freigegeben.

LG Toby
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Memory-Leak bei PHP:

  Alt 4. Aug 2008, 19:50
Er möchte aber zwischendrin freigeben.

Zitat:
und ich stosse bei ein paar Webseiten so langsam an Kapazitaetsgrenzen
  Mit Zitat antworten Zitat
xSkaschY

Registriert seit: 19. Jun 2006
Ort: Bünde
95 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Memory-Leak bei PHP:

  Alt 4. Aug 2008, 19:51
Zitat von Die Muhkuh:
Er möchte aber zwischendrin freigeben.
Hab ich gelesen, habe dazu auch geschrieben was möglich ist.

//

Prinzipiel sollten 32 MB Phsy. RAM für ein grösseres CMS locker reichen, und die hat man nahe zu überall garantiert, ergo sollte man vielleicht die Logik überdenken?

//

No Problem! Sorry auch meinerseits, editiere lieber meine Posts als was zum gleichen Betreff zu posten
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Memory-Leak bei PHP:

  Alt 4. Aug 2008, 19:53
Sorry, hatte Dein Edit noch nicht gesehen.
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#6

Re: Memory-Leak bei PHP:

  Alt 4. Aug 2008, 20:45
Moin ihr zwei,

prinzipiell ist das Problem ein Code, der ne Datenbank auf UTF-8 umstellt. Der einzige Weg, den ich gefunden hab, ist alle Daten einer Tabelle auszulesen, zu bearbeiten und dann zu speichern. Dass ich nicht alle Rows auf einmal holen sollte, ist dabei wohl klar. In einer Schleife mach ich essentiell das:
Code:
$result = $db->query($sql);
while ($row = $db->fetchrow($result)
{
  // Code
}
$db->free($result);
Solang da wenig Daten kommen, ist das ja kein Problem. Wenn eine Tabelle aber gute 60 MB an Daten hat, wirds uebel. Schliesslich gibt PHP den Speicher nicht definitiv frei; genau dafuer muesste es aber eine Moeglichkeit geben. Jede Zeile in dieser Tabelle ist nicht gross, aber die Summe machts halt.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#7

Re: Memory-Leak bei PHP

  Alt 4. Aug 2008, 21:23
Das ist vielleicht nicht ganz sauber, aber: gib dem Script doch einen Parameter mit, der die Start-ID der zu bearbeitenden Daten enthält. Nach x tausend Zeilen redirectest du einfach auf dich selbst, mit entsprechend neu gesetztem Parameter.

php wird seinen Speicher doch wohl nach Ende einer Abfrage freigeben
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Memory-Leak bei PHP

  Alt 4. Aug 2008, 22:17
Ich denke, dass ist die eleganteste Lösung. Viele Scripts nutzen diese Technik, z.B. der Woltlab Burning Board Installer und einige Backupscripts.
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#9

Re: Memory-Leak bei PHP

  Alt 4. Aug 2008, 23:42
Muss es PHP sein? Für "große" Aufgaben würde ich eine solche Lösung vorschlagen, falls Du entsprechende Voraussetzungen auf dem Server hast oder schaffen kannst.
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#10

Re: Memory-Leak bei PHP

  Alt 4. Aug 2008, 23:50
Zitat von Christian S.:
Muss es PHP sein? Für "große" Aufgaben würde ich eine solche Lösung vorschlagen, falls Du entsprechende Voraussetzungen auf dem Server hast oder schaffen kannst.
Hatte ich ueberlegt, aber nachdem ich momentan noch keinen V- oder Root-Server hab faellt die Loesung leider flach

Die Moeglichkeit, das Script neu aufzurufen und immer wieder einen neuen Teil abzuarbeiten kenn ich und nutze sie auch schon bei anderen Dingen. Allerdings hab ich relativ wenig Bock drauf, das Update-System darauf umzuschreiben - v.a. weil das System automatisch laeuft. Soll heissen, ich sag dem nichtmal welche Tabellen es gibt. Wenn ich da noch aufteilen muesste, wuerde das einen extremen Overhead bedeuten, mal ganz davon abgesehn, dass ich erstmal rausfinden muesste, wo die Grenze ist

Aber ganz ehrlich: es muss doch eine Moeglichkeit geben, zu verhindern dass Speicher, den ich freigeb auch weiterhin als "belegt" betrachtet wird. Oder werde ich da tatsaechlich von der Sprache enttaeuscht?

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz