2010-09-08 9 views
8

Entsprechend meiner Ausgabe von xdebug gibt is_array() die Menge an Speicher frei, die als Argument an sie übergeben wird. Wenn ich ein großes Array übergebe, leckt es eine Menge Speicher, nur um zu überprüfen, ob es ein Array ist.Warum verliert is_array() Speicher in PHP?

Gibt es einen Workaround dafür?

17.4313 21858520 +70004     -> is_array() [...]/app/app_model.php:526 

Hier ist der Code-Schnipsel, die das Leck verursacht:

 $ret = $this->behaviors[$b[$i]]->afterFind($this, $results, true); 
     if (is_array($ret)) { 
      $results = $ret; 
     } 

Ich laufe dies auf Linux (Ubuntu 9,04)

PHP: 5.3.2

xdebug: 2,0 .5

uname -a gibt mir das:

Linux linux8 2.6.28-19-server # 64-Ubuntu SMP Mi 18. August 21.57.33 UTC 2010 i686 GNU/Linux

+2

Ich glaube, Sie haben vergessen, die PHP-Version und Ihren Code anzugeben, der für dieses Leck relevant sein sollte. 'insertPHPJoke()' –

+5

Was meinst du mit "Leckspeicher"? Der Speicher wird nach dem Anruf nicht zurückgewonnen? – Artefacto

+1

Kann ich es hier nicht reproduzieren: hast du 'xdebug.collect_params' aktiviert, und was passiert, wenn du es deaktivierst? – Wrikken

Antwort

5

Meine erste Reaktion:

Select isn't broken.

Meine zweite Reaktion:

können Sie drei Dinge schließen:

  • ein weit verbreitetes Stück Software (is_array) ist gebrochen - Sie sind die erste
  • xdebug gebrochen Berichte zu bemerken ein Leck, wo es keine gibt
  • xdebug und PHP nicht gut zusammenarbeiten, da es Speicherverwaltung betrifft

Eine weit verbreitete und verwendete Funktion ist meist nicht das Problem. Versuchen Sie, das Auftreten des ‚xdebug Leck Berichts‘ zu verengen durch einfacheren Code ausgeführt wird:

$arr = array_fill(0, 10000, "content"); 
$mallocbytes=true;// set to true to get process 
$usage=memory_get_usage(!$mallocbytes); 
for($i=0; $i!=1000000; $i=$i+1) { 
    is_array($arr); 
    $newusage=memory_get_usage(!$mallocbytes); 
    if($newusage != $usage) { 
     print("diff after $i'th is_array: ".($newusage-$usage)."\n"); 
    } 
    $usage=$newusage; 
} 

Werfen Sie einen Blick auf dem tatsächlichen Speicherverbrauch Ihrer PHP-Laufzeit. Ich wette, es wird nicht wachsen.

+0

Nach dem Ausführen Ihres Beispiels glaube ich, dass das Problem in xdebug und nicht in der PHP-Laufzeit ist. – MapDot

Verwandte Themen