I use NestedSetBehavior model extension in my project for using db table as a tree.
I wroute example:
$model = SiteMap()->findAll();
$log .= $this->debug_memory('used')."<br>";
$ancestors = null;
foreach ($model as $item) {
$ancestors = $item->ancestors()->findAll();
}
$log .= $this->debug_memory('used')."<br>";
echo $log;
(debug_memory source just return friendly memory_get_usage(), $model has 50 items)
The result is:
used: 10525440
used: 15892712
After simple calculation – memory usage increased on 5,24 Mb.
But i must use $item->ancestors()->findAll(); many times in cycle, so my memory increased on 138 Mb. And i get @out of memory error”.
I try use unset():
$model = SiteMap()->findAll();
$log .= $this->debug_memory('used')."<br>";
$ancestors = null;
foreach ($model as $item) {
$ancestors= $item->ancestors()->findAll();
}
$ancestors = null;
unset($ancestors);
$log .= $this->debug_memory('used')."<br>";
echo $log;
But i steel get result:
used: 10525984
used: 15893320
Behavior ancestors function source is:
public function ancestors($depth=null)
{
$owner=$this->getOwner();
$db=$owner->getDbConnection();
$criteria=$owner->getDbCriteria();
$alias=$db->quoteColumnName($owner->getTableAlias());
$criteria->mergeWith(array(
'condition'=>$alias.'.'.$db->quoteColumnName($this->leftAttribute).'<'.$owner->{$this->leftAttribute}.
' AND '.$alias.'.'.$db->quoteColumnName($this->rightAttribute).'>'.$owner->{$this->rightAttribute},
'order'=>$alias.'.'.$db->quoteColumnName($this->leftAttribute),
));
if($depth!==null)
$criteria->addCondition($alias.'.'.$db->quoteColumnName($this->levelAttribute).'>='.($owner->{$this->levelAttribute}-$depth));
if($this->hasManyRoots)
{
$criteria->addCondition($alias.'.'.$db->quoteColumnName($this->rootAttribute).'='.CDbCriteria::PARAM_PREFIX.CDbCriteria::$paramCount);
$criteria->params[CDbCriteria::PARAM_PREFIX.CDbCriteria::$paramCount++]=$owner->{$this->rootAttribute};
}
return $owner;
}
So, my questions is, why this function use so many memory and why when i unset variable memory is not cleaning?
Comment out the logging in your
protected/config/main.phpfile. (Or wherever you define your configuration settings.)What you are seeing is likely a result of all the logs being written on each Active Record call, which would explain why unsetting the object doesn’t release memory: the memory used isn’t in the model, it’s in the log.
Try that and report results.