【问题标题】:Where is my memory leak in this Doctrine 1.2 code?我在这个 Doctrine 1.2 代码中的内存泄漏在哪里?
【发布时间】:2010-09-22 18:30:22
【问题描述】:

我正在尝试减少大型循环脚本的内存使用量,所以我做了这个小测试。使用 Doctrine 我运行此代码:

$new_user_entry = getById($new_user_entries[0]['id']);
unset($new_user_entry);

$new_user_entry = getById($new_user_entries[1]['id']);
unset($new_user_entry);

function getById($holding_id)
{
    return Doctrine_Core::getTable('UserHoldingTable')->findOneById($holding_id);
}

但是每次我执行 getById 并取消设置时,它都会在内存中留下大约 50 KB 的空间,我不知道为什么或如何更改它。我有一个循环,它会遍历数千个这样的函数以及其他几个函数,这会造成问题。

【问题讨论】:

  • 你在 Doctrine 中启用了缓存吗? doctrine-project.org/documentation/manual/1_2/en/…
  • 如果默认激活,是的。但我自己还没有打开它。
  • 好吧,我的意思是,如果启用缓存,这将解释您的内存泄漏 - Doctrine 仍然会缓存对象,因为您只会释放对它们的引用,而不是 Doctrine 的引用。跨度>
  • 只是在黑暗中拍摄,但如果您引用它会有帮助吗? $new_user_entry =& getById($new_user_entries[0]['id']);。因为您将 getById 的返回值复制到 new_user_entry 变量中,并且只是取消设置,而原始值保留在内存中。不过可能完全错了,这就是为什么我没有发布作为答案;)
  • 我会在重新访问时尝试这样做。我现在的解决方案是只编写手动查询,以便我可以完全控制加载的内容,现在就像冠军一样工作。

标签: php doctrine


【解决方案1】:

我找不到更好的解决方案,所以我放弃了 Doctrine 的这个功能,并使用 mysqli 进行了手动查询。这边解决了问题,虽然不理想,但一切正常。

【讨论】: