私のプロジェクトでは、db テーブルをツリーとして使用するために NestedSetBehavior モデル拡張を使用しています。
私は例を書きます:
$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;
}
それで、私の質問は、なぜこの関数が非常に多くのメモリを使用するのか、変数メモリを設定解除するとクリーニングされないのはなぜですか?