我的平台是PHP 5.2,Apache,Magento EE 1.9和CentOS。
我有一个非常基本的脚本,它使用PHP的ms_sql()函数从MS-SQL数据库中获取大约60,000行数据。然后通过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功能是否会导致内存泄漏?
如果是这样,我该如何阻止他们这样做?
理想情况下,此脚本应完全“被动”:只需获取查询结果,稍微修改一下(此时需要非常临时的内存),然后将它们直接转储到文件中并销毁内存。但这不会发生!
由于
答案 0 :(得分:1)
从代码中排除所有Mage::
,只是将数据转储到文件而不进行处理。并了解内存在执行此操作时会发生什么。然后开始逐个添加Mage::
函数,看看它何时中断。
这样你就会找到罪魁祸首。然后你需要开始深入研究它的实现,看看会出现什么问题。您也可以考虑在不依赖Mage::
电话的情况下进行处理。 只需编写简单的代码来处理自包含函数/类中的数据,并比较如果将Mage::
完全排除在流程之外的事情。
答案 1 :(得分:0)
是的 - 当涉及内存管理和推动其面向对象模型边缘的代码时,PHP有很长的非理想行为历史。
您可以尝试alternate method查询浪费较少内存的数据,或者read up了解Magento核心团队如何处理同一问题。