我的平台是PHP 5.2、Apache、Magento EE 1.9和CentOS。
我有一个非常基本的脚本,它使用PHP的MS_SQL()函数从MS-SQL数据库中获取大约60000行数据。然后通过来自Magento的数据对数据进行一点处理,并最终写入文本文件。
非常简单的东西。。。
$result = mssql_query($query);
while($row = mssql_fetch_assoc($result)) {
$member = $row; // Copied so I can modify it
// Do some stuff with each row... e.g.:
$customer = Mage::getModel("customer/customer");
$customer->loadByEmail($member["email"]);
$customerId = $customer->getId();
// Some more stuff like that...
$ordersCollection = Mage::getResourceModel('sales/order_collection');
// ...........
// Some more stuff like that...
$wishList = Mage::getModel('wishlist/wishlist')->loadByCustomer($customer);
// ...........
// Write straight to a file
fwrite($fp, implode("'t", $member) . "'r'n");
// Probably not even necessary
unset($member);
}
问题是,我的脚本的内存使用量随着循环的每次迭代而增加(每300行大约10MB),理论峰值大约为2GB(尽管还没有达到)。
我已经尽了很大的努力来确保我不会在内存中留下任何数据没有构建庞大的数组,也没有向其中添加变量,所有内容要么是unset()
,要么是循环的每次迭代直接覆盖
所以我的问题是:Magento函数会导致内存泄漏吗?
如果是这样,我该如何阻止他们这样做?
理想情况下,该脚本应该完全"被动":只需获取查询结果,对其进行一点修改(这需要非常临时的内存),然后将其直接转储到文件中并销毁内存。但这并没有发生
感谢
从代码中排除所有Mage::
,只将数据转储到文件中而不进行处理然后看看执行此操作时内存会发生什么变化。然后开始一个接一个地添加Mage::
函数,看看它什么时候坏了。
这样你就能找到罪魁祸首然后你需要开始深入研究它的实现,看看会出什么问题。您也可以考虑在不依赖Mage::
调用的情况下进行处理只需编写简单的代码来处理自包含函数/类中的数据,并比较如果将Mage::
完全排除在进程之外的情况
是的——PHP在内存管理和推动其面向对象模型边缘的代码方面有着长期的非理想行为。
你可以尝试另一种方法来查询浪费更少内存的数据,也可以阅读Magento核心团队如何处理同样的问题。