私は symfony 1.4 + propel 1.6 を使用しており、すべてのユーザー データベースを ElasticSearch にエクスポート (インデックス) したいと考えています。
すべてのスクリプトを作成しましたが、1 つの問題を除けば、すべて問題なく動作しています。約 20.000~ 回繰り返すループを作成し、毎回 memory_usage が増加します。
問題は次のとおりです。すべての参照を破棄しているため、そうすべきではありません。
Propel は、私が作成するすべてのオブジェクトへの静的参照をどこかに残していると思います。ただし、インスタンスのプールを既に無効にしているため、見つかりません。
誰も似たような問題を抱えたことがありますか?PHP のメモリ制限をデバッグするにはどうすればよいか、誰かが考えているのではないでしょうか? (webgrind はありません) このコードのデバッグにここ数時間費やしましたが、まだ修正できません。
// optimizations
gc_enable();
Propel::getConnection()->useDebug(false);
Propel::disableInstancePooling();
// the while
$offset = 0;
$perpage = 10;
$c = SearchUserQuery::create()->limit($perpage);
do {
$rs = SearchUserPeer::doSelectStmt($c);
while ($row = $rs->fetch(PDO::FETCH_NUM))
{
$instance = new SearchUser();
$instance->hydrate($row);
$data = $instance->toElastic(); // this line makes a lot of memory leak
$_document = new Elastica\Document($instance->getPrimaryKey(), $data);
$_type->addDocument($_document);
unset($_document, $instance);
}
$c->offset($offset += $perpage);
} while( $rs->rowCount() );
関数 $instance->toElastic は次のようになります。
public function toElastic()
{
return Array(
'profile' => $this->toArray(BasePeer::TYPE_COLNAME, false),
'info' => $this->getUserInfo()->toArray(BasePeer::TYPE_COLNAME, false),
'branches' => $this->getElasticBranches(),
);
}
/**
* @return array(id,name)
*/
public function getElasticBranches()
{
$branches = Array();
foreach ($this->getsfGuardUser()->getUserBranchs() as $branch)
$branches[] = Array(
'id' => $branch->getBranchId(),
'name' => $branch->getName()
);
return $branches;
}