繁体   English   中英

使用Symfony + Doctrine的PHP中的内存泄漏

[英]Memory leak in PHP with Symfony + Doctrine

我将PHP与Symfony框架(以Doctrine作为我的ORM)一起使用,以构建可对某些站点进行爬网的蜘蛛。

我的问题是以下代码会产生内存泄漏:

$q = $this -> createQuery('Product p');

if($store) {
    $q
        -> andWhere('p.store_id = ?', $store -> getId())
        -> limit(1);
}

$q -> andWhere('p.name = ?', $name);

$data = $q -> execute();
$q -> free(true);
$data -> free(true);
return NULL;

此代码位于Doctrine_Table的子类中。 如果我注释掉执行部分(当然还有$data -> free(true) ),泄漏将停止。 这使我得出结论,就是导致泄漏的是Doctrine_Collection

我通过释放取消设置数据来解决了Doctrine内存泄漏的问题,您尝试过吗?

// ...
$data->free(true) ;
unset($data) ;
// ...

您正在使用哪个版本的PHP? 如果它小于5.3,则可能与“递归引用泄漏内存”错误有关。

您也可以尝试调用Doctrine_Manager::connection()->clear() ,这应该清理连接并删除标识映射条目

我只是遇到连续运行的CLI命令遇到的相同问题。 花了许多小时解决此问题后,事实证明,以prod模式运行我的命令实际上解决了该问题:

app/console my:custom:command --env=prod

您应该使用addWhere代替andWhere吗? 另外,我认为应该在声明的末尾添加一个限制,请尝试:

$q = $this -> createQuery('Product p') -> where('p.name = ?', $name);

 if($store) {
$q
    -> addWhere('p.store_id = ?', $store -> getId())
    -> limit(1);
 }

 $data = $q -> execute();
 $q -> free(true);
 $data -> free(true);
return NULL;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM