Symfony任务 - 内存泄漏

时间:2012-07-04 16:42:43

标签: php memory-leaks symfony1 propel

我写了一个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();
}

如何限制内存的使用?

3 个答案:

答案 0 :(得分:3)

这是最终代码。它可以在相同的内存使用级别上工作。大家好。

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();
}

答案 1 :(得分:0)

symfony CLI任务需要相当多的PHP内存,尤其是在Windows上。如果Propel任务失败,我建议永久更改内存分配的php.ini文件设置至少256M。我知道这看起来很高,但你应该只需要在开发机器上完成这些任务。

答案 2 :(得分:0)

an other thread on SO中有一些很好的提示。

这是关于memory leak using propel的一篇非常好的博文。这是法语,但它真的很有趣。

而且,如果您正在处理大数据(例如批量导入),您还应该查看pcntl_fork(see this gist)。 pcntl_fork在Windows上不起作用。我使用这种方法来处理大量导入,它非常快,并且不会占用你所有的记忆。