【发布时间】:2013-04-13 15:43:13
【问题描述】:
运行这个简单的脚本时,我得到了下面发布的输出。 这让我觉得我的代码或 Zend Framework/Magento 堆栈中存在内存泄漏。迭代任何类型的 Magento 集合时会出现此问题。 我有什么遗漏或做错了吗?
脚本:
$customersCollection = Mage::getModel('customer/customer')->getCollection();
foreach($customersCollection as $customer) {
$customer->load();
$customer = null;
echo memory_get_usage(). "\n";
}
输出:
102389104
102392920
...
110542528
110544744
【问题讨论】:
-
这是我找到的另一个reference。看起来问题出在循环引用上。
-
@osondoar 如果您至少使用 PHP 5.3(您现在应该是)循环引用将被垃圾收集器捕获,尽管不是立即。但是,请参阅我的回答,了解为什么您的示例甚至不会释放非循环引用。
-
鉴于 Magento 的 ORM,这不适合使用
load()。你想完成什么? -
是的,在 PHP 的 OOP 实现中可能会发生内存泄漏。请参阅此处了解这对 Magento 的影响:magentocommerce.com/blog/garbage-collector。
clearInstance方法(如果在对象中实现,$customer->clearInstance())有时可以清除这些引用,但并不总是可以控制特定方法调用中的所有内容。例如,您对load的调用缺少 ID,这意味着 Magento 尝试使用空白 ID 重新加载对象,这会导致各种奇怪的实例化和对象清理,从而触发泄漏行为。 -
@AlanStorm 再一次,该文章将 PHP 的内存管理器(当引用计数达到零时立即释放内存)与 PHP 5.3+ 的垃圾收集器(定期检查循环引用,即使它们不可访问,其引用计数也永远不会为零)。
标签: php magento zend-framework