【问题标题】:How to correctly close an Entity Manager in doctrine如何在学说中正确关闭实体管理器
【发布时间】:2011-12-03 09:45:06
【问题描述】:

我在 Doctrine2 脚本中遇到了内存泄漏问题,这显然是由一段本应消除内存问题的代码引起的。

在我知道您可以(并且应该)清除实体管理器之前,每 20 次迭代我执行​​了以下操作:

if ($this->usersCalculated % 20 == 0) {
   $this->em->close();
   $this->em = \Bootstrap::createEm();
   $this->loadRepositories();
}

Bootstrap::createEm 看起来像这样:

public static function createEm() {
    $em = EntityManager::create(Bootstrap::$connectionOptions, Bootstrap::$config);
    $em->getConnection()->setCharset('utf8');
    return $em;
}

我首先重新创建实体管理器的原因是因为我的 UnitOfWork 越来越疯狂,而我不知道 $em->clear() 方法。

因此,即使我当前的内存泄漏目前似乎已解决(或至少减少了),当我需要执行单独的插入/更新查询时,我仍然必须创建一个新的实体管理器,而无需依赖其他人来执行冲洗。例如,每当我发送电子邮件时,我都会在数据库中插入一行来表明这一点,代码如下所示:

    $emailSent = new \model\EmailSent();
    $emailSent->setStuff();
    // I do it in a new em to not affect whatever currentunit was doing.
    $newEm = \Bootstrap::createEm();
    $newEm->persist($emailSent);
    $newEm->flush();
    $newEm->close();

根据我之前的经验,这留下了一些内存泄漏。

所以我的问题是,我在这里做错了什么?为什么会泄漏内存?我应该如何真正关闭/重新创建实体管理器?

【问题讨论】:

    标签: php memory-leaks doctrine doctrine-orm


    【解决方案1】:

    您是否尝试过实际使用 clear 方法而不是 close 方法?

    希望对你有所帮助---> Batch Processing

    【讨论】:

    • @Cristian_Douce 正如我在问题中所说,在我使用 clear 而不是重新创建后,我的内存泄漏问题得到了解决。但是这个问题仍然有效,因为我还有脚本的其他部分需要创建和销毁 em。
    • @Cristian_Douce 我在关闭它之前清除它。而且我已经阅读了 close 函数的教义代码,它所做的只是调用 clear 并将其标记为已关闭。必须有一些静态属性或持久对象持有对 em 的引用,否则垃圾收集器会释放它。
    【解决方案2】:

    你试过了吗:

    $this->em->getConnection()->getConfiguration()->setSQLLogger(null);
    

    我了解到这会关闭未清除的 SQL 记录器,并且有时会像您遇到的那样产生内存泄漏。

    【讨论】:

      猜你喜欢
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2014-07-12
      相关资源
      最近更新 更多