1

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

如何限制内存的使用?

4

3 回答 3

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();
}
于 2012-07-05T16:42:48.353 回答
0

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

于 2012-07-04T16:48:14.213 回答
0

您在 SO 的另一个线程中有一些很好的提示。

这是一篇关于使用 propel 的内存泄漏的非常好的博客文章。它是法语的,但它真的很有趣。

而且,如果您正在处理大数据(例如批量导入),您还应该查看 pcntl_fork(请参阅此要点)。pcntl_fork 在 Windows 上不起作用。我用这种方法来处理大的导入,它真的很快而且不会吃掉你所有的记忆。

于 2012-07-05T07:19:59.977 回答