【问题标题】:Memory leak in PHP with Symfony + Doctrine使用 Symfony + Doctrine 的 PHP 内存泄漏
【发布时间】:2011-02-27 17:27:57
【问题描述】:

我正在使用 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 导致了泄漏。

【问题讨论】:

    标签: php memory-leaks symfony1 doctrine


    【解决方案1】:

    您应该使用 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;
    

    【讨论】:

    • addWhere 和 andWhere 是彼此的同义词并且工作相同,您的更改对内存泄漏没有影响。
    • 酷,不知道 add/andWhere,抱歉我帮不上什么忙。
    【解决方案2】:

    您使用的是什么版本的 PHP?如果它是 'recursive references leak memory' 错误有关。

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

    【讨论】:

    • 我使用的是 5.3.2。你确定 Doctrine_Manager::connection()->clean() 是正确的吗?我在 API 中找不到,无法调用。
    【解决方案3】:

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

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

    【讨论】:

    • 这确实有效!奇怪的是,PHP 应该自己清理它。还是会改用 CakePHP,感觉更好 :) 我可以补充一点,我确实也做了 unset($q)。
    【解决方案4】:

    我只是在使用连续运行的 CLI 命令时遇到了同样的问题。在花了很多时间解决这个问题之后,结果证明在prod 模式下运行我的命令实际上解决了这个问题:

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

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 2023-03-17
      • 2012-04-17
      • 2012-01-12
      • 2017-01-28
      • 2016-03-30
      相关资源
      最近更新 更多