Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Memory-Leak bei PHP (https://www.delphipraxis.net/118285-memory-leak-bei-php.html)

alcaeus 4. Aug 2008 18:23


Memory-Leak bei PHP
 
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

xSkaschY 4. Aug 2008 18:47

Re: Memory-Leak bei PHP:
 
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

Die Muhkuh 4. Aug 2008 18:50

Re: Memory-Leak bei PHP:
 
Er möchte aber zwischendrin freigeben.

Zitat:

und ich stosse bei ein paar Webseiten so langsam an Kapazitaetsgrenzen

xSkaschY 4. Aug 2008 18:51

Re: Memory-Leak bei PHP:
 
Zitat:

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 :)

Die Muhkuh 4. Aug 2008 18:53

Re: Memory-Leak bei PHP:
 
Sorry, hatte Dein Edit noch nicht gesehen.

alcaeus 4. Aug 2008 19:45

Re: Memory-Leak bei PHP:
 
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

Dax 4. Aug 2008 20:23

Re: Memory-Leak bei PHP
 
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 :gruebel:

Namenloser 4. Aug 2008 21:17

Re: Memory-Leak bei PHP
 
Ich denke, dass ist die eleganteste Lösung. Viele Scripts nutzen diese Technik, z.B. der Woltlab Burning Board Installer und einige Backupscripts.

Christian S. 4. Aug 2008 22:42

Re: Memory-Leak bei PHP
 
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.

alcaeus 4. Aug 2008 22:50

Re: Memory-Leak bei PHP
 
Zitat:

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:46 Uhr.
Seite 1 von 2  1 2      

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