簡體   English   中英

Symfony任務 - 內存泄漏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM