2012-07-04 35 views
1

我写了一个symfony任务来填充示例数据的数据库。以下是一段代码示例: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

可能重复http://stackoverflow.com/questions/2097744/php-symfony-doctrine-memory-leak – j0k

回答

0

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

这里是一个非常好的博客文章memory leak using propel。这是法文,但它真的很有趣。

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

+1

丹科,我用的Propel :: disableInstancePooling( );在错误的地方。它应该是内部方法。 –

+0

关于pcntl_fork,我写了一个小型库来缓解使用它的痛苦:https://github.com/AZielinski/SimpleProcess – adamziel

0

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

+1

'$ PHP -r memory_limit的= -1' – hakre

3

这是最终的代码。它可以在相同的内存使用级别下工作很长时间。 Thx大家。

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

感谢你的这一点,它也适用于我。不过,我注意到gc_collect_cycles();没有必要,但它会使代码运行速度变慢。 – Aston