![]() |
Memory-Leak bei PHP
Hallo,
ich hab ein kleines Problem mit nem MemLeak in PHP. Gegeben sei folgender Code:
Code:
Die Ausgabe ist folgende:
$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>";
Code:
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.
Array
( [0] => 59256 [1] => 59344 [2] => 59344 [3] => 59344 ) 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 |
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:
Der Memory wird beim Scriptende automatisch wieder freigegeben.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 LG Toby |
Re: Memory-Leak bei PHP:
Er möchte aber zwischendrin freigeben.
Zitat:
|
Re: Memory-Leak bei PHP:
Zitat:
// 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 :) |
Re: Memory-Leak bei PHP:
Sorry, hatte Dein Edit noch nicht gesehen.
|
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:
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.
$result = $db->query($sql);
while ($row = $db->fetchrow($result) { // Code } $db->free($result); Greetz alcaeus |
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: |
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.
|
Re: Memory-Leak bei PHP
Muss es PHP sein? Für "große" Aufgaben würde ich eine
![]() |
Re: Memory-Leak bei PHP
Zitat:
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 10:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz