2010-09-08 6 views
8

Selon ma sortie xdebug, is_array() perd la quantité de mémoire qui lui est passée en argument. Si je lui passe un grand tableau, il perd une tonne de mémoire juste pour vérifier si c'est un tableau.Pourquoi is_array() manque-t-il de mémoire en PHP?

est-il une solution pour cela?

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

est ici l'extrait de code qui provoque la fuite:

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

Je suis en ce sous Linux (Ubuntu 9.04)

PHP: 5.3.2

xdebug: 2.0 0,5

uname -a me donne ceci:

Linux linux8 2.6.28-19-server # 64 Ubuntu SMP Mer 18 août 2010 21:57:33 UTC i686 GNU/Linux

+2

Je pense que vous avez oublié de spécifier la version de PHP et votre code, ce qui devrait être pertinent pour cette fuite. 'insertPHPJoke()' –

+5

Que voulez-vous dire "mémoire de fuite"? La mémoire n'est pas récupérée après l'appel? – Artefacto

+1

Est-ce que je ne peux pas le reproduire ici: avez-vous '' xdebug.collect_params' activé, et que se passe-t-il si vous le désactivez? – Wrikken

Répondre

5

Ma première réaction:

Select isn't broken.

Ma deuxième réaction:

Vous pouvez conclure trois choses:

  • une pièce largement répandue de logiciels (is_array) est cassé - Vous êtes le premier à remarquer
  • xdebug est des rapports cassés une fuite où il n'y en a pas
  • xdebug et PHP ne fonctionnent pas bien ensemble car cela concerne la gestion de la mémoire

Une fonction largement répandue et utilisée n'est le plus souvent pas le problème. Essayez de limiter l'apparition du « rapport de fuite xdebug » en exécutant le code plus simple:

$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; 
} 

Jetez un oeil à la consommation réelle de la mémoire de votre temps d'exécution PHP. Je parie que ça ne va pas grandir.

+0

Après avoir exécuté votre exemple, je crois que le problème est dans xdebug et pas dans le runtime PHP. – MapDot