2010-12-29 14 views
0

Ich habe eine schreckliche Menge von Problemen mit einem XML-Parsing-Skript einige Speicher in PHP leckt.PHP-Speicher-Leck-Frage

Ich habe eine Lösung gemacht, indem ich meinen gesamten OOP-Code in non OOP umgeschrieben habe, was hauptsächlich Datenbankprüfungen und -einfügungen waren, und das schien das Loch zu stopfen, aber ich bin neugierig, was das verursacht hat? Ich benutze das Zend Framework und sobald ich alle Model-Sachen entfernt habe, gibt es keine Lecks mehr.

Nur um Ihnen und die Idee, wie schlimm es war: Ich laufe durch einige 30k Elemente auf der gleichen Anzahl von Dateien. Also, eins pro Datei. Es begann mit 5mb !!! oder RAM, wenn die Datei selbst nur ca. 20kb groß war.

Könnte es sich um die Referenzierungsfunktionen handeln, von denen ich gelesen habe? Ich dachte, dass dieser Fehler behoben wurde ?!

EDIT

Ich fand heraus, dass das Leck mit Zend Framework-Datenbankklassen zurückzuführen ist. Gibt es eine Möglichkeit, nach jeder Iteration eine Shutdown-Funktion aufzurufen, damit die Ressourcen gelöscht werden?

Antwort

1

Es ist ziemlich schwierig, dies zu beantworten, da wir keinen Code haben, um damit zu arbeiten.

Revert zurück in die OOP-Version Ihrer Quellen und eine kleine Klasse erstellen, wie so:

abstract class MemoryLeakLogger 
{ 
    public static $_logs = array(); 

    public function Start($id,$action) 
    { 
      self::$_logs[$id] = array(
       'action' => $action, 
       'start_ts' => microtime(), 
       'memory_start' => memory_get_usage() 
     ); 
    } 

    public function End($id) 
    { 
      self::$_logs[$id]['end_ts'] = microtime(); 
      self::$_logs[$id]['memory_end'] = memory_get_usage(); 
    } 

    public static function GetInformation(){return self::$_logs;} 
} 

und dann in Ihrer Anwendung wie folgt vor:

MemoryLeakLogger::Start(":xml_parse_links_set_2", "parsing set to of links"); 
/* 
    * Here you would do the relative code 
*/ 
MemoryLeakLogger::End(":xml_parse_links_set_2"); 

Und so weiter in Ihrer Anwendung , müssen Sie Berechnungen erstellen, um die Offsets für Speicherbelegungen und die Zeit pro Aktion zu erfassen. Sobald Ihr Skript fertig ist, debuggen Sie die Informationen, indem Sie sie leserlich ausdrucken und nach Peaks suchen

Sie können auch xdebug verwenden, um Ihre Anwendung zu verfolgen.

Hoffe, das hilft