我写了一个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();
}
如何限制内存的使用?
答案 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上不起作用。我使用这种方法来处理大量导入,它非常快,并且不会占用你所有的记忆。