[英]Symfony task - memory leak
我寫了一個symfony任務來填充樣本數據的數據庫。 這是一段代碼示例:
gc_enable();
Propel::disableInstancePooling();
public function test()
{
for($i = 0; $i < 10000; $i++) {
$this->doIt($i);
}
}
public function doIt($i)
{
$user = new User();
$user->setUsername('user' . $i . "@example.com");
$user->setPassword('test');
$user->setFirstName('firstname' . $i);
$user->setLastName('surname' . rand(0, 1000));
$user->save();
$user->clearAllReferences(true);
$user = null;
gc_collect_cycles();
}
我怎樣才能限制內存的使用?
這是最終的代碼。 它可以在相同的內存使用級別上工作。 大家好。
public function test()
{
for($i = 0; $i < 10000; $i++) {
$this->doIt($i);
}
}
public function doIt($i)
{
gc_enable();
Propel::disableInstancePooling();
$user = new User();
$user->setUsername('user' . $i . "@example.com");
$user->setPassword('test');
$user->setFirstName('firstname' . $i);
$user->setLastName('surname' . rand(0, 1000));
$user->save();
$this->delete($user);
}
public function delete($obj)
{
$obj->clearAllReferences(true);
unset($obj);
// redundant
// gc_collect_cycles();
}
symfony CLI任務需要相當多的PHP內存,尤其是在Windows上。 如果Propel任務失敗,我建議永久更改內存分配的php.ini文件設置至少256M。 我知道這看起來很高,但你應該只需要在開發機器上完成這些任務。
在SO上的其他帖子中你有一些很好的提示。
這是一篇關於使用推進器進行內存泄漏的非常好的博客文章。 這是法語,但它真的很有趣。
而且,如果您正在處理大數據(例如大量導入),您還應該看看pcntl_fork( 請參閱此要點 )。 pcntl_fork在Windows上不起作用。 我使用這種方法處理大量導入,它真的很快,不會占用你所有的記憶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.