Por que esse script php simples vaza memória?

Na esperança de evitar futuros vazamentos de memória em programas php (módulos drupal, etc.), tenho andado por aí com scripts php simples que vazam memória.

Poderia um especialista em php me ajudar a encontrar o que sobre esse script faz com que o uso da memória suba continuamente?

Tente executá-lo você mesmo, alterando vários parâmetros. Os resultados são interessantes. Aqui está:

<?php

function memstat() {
  print "current memory usage: ". memory_get_usage() . "\n";
}

function waste_lots_of_memory($iters) {
  $i = 0;
  $object = new StdClass;
  for (;$i < $iters; $i++) {
    $object->{"member_" . $i} = array("blah blah blha" => 12345);
    $object->{"membersonly_" . $i} = new StdClass;
    $object->{"onlymember"} = array("blah blah blha" => 12345);
  }
  unset($object);
}

function waste_a_little_less_memory($iters) {
  $i = 0;
  $object = new StdClass;
  for (;$i < $iters; $i++) {

    $object->{"member_" . $i} = array("blah blah blha" => 12345);
    $object->{"membersonly_" . $i} = new StdClass;
    $object->{"onlymember"} = array("blah blah blha" => 12345);

    unset($object->{"membersonly_". $i});
    unset($object->{"member_" . $i});
    unset($object->{"onlymember"});

  }
  unset($object);
}

memstat();

waste_a_little_less_memory(1000000);

memstat();

waste_lots_of_memory(10000);

memstat();

Para mim, a saída é:

current memory usage: 73308
current memory usage: 74996
current memory usage: 506676

[editado para remover mais membros do objeto]

questionAnswers(6)

yourAnswerToTheQuestion