我在我的项目中使用 NestedSetBehavior 模型扩展来将 db 表用作树。
我写了一个例子:
$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 源只返回友好的 memory_get_usage(),$model 有 50 个项目)
结果是:
used: 10525440
used: 15892712
经过简单的计算 - 内存使用量增加了 5,24 Mb。
但我必须使用 $item->ancestors()->findAll(); 循环多次,所以我的内存增加了 138 Mb。我得到@out of memory 错误”。
我尝试使用 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;
但我得到了结果:
used: 10525984
used: 15893320
行为祖先函数源码为:
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;
}
所以,我的问题是,为什么这个函数使用这么多内存,为什么当我取消设置变量内存时没有清理?