内部循环内存使用增加:Magento是否起作用?

时间:2013-07-28 05:34:10

标签: php apache oop magento

我的平台是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功能是否会导致内存泄漏?

如果是这样,我该如何阻止他们这样做?

理想情况下,此脚本应完全“被动”:只需获取查询结果,稍微修改一下(此时需要非常临时的内存),然后将它们直接转储到文件中并销毁内存。但这不会发生!

由于

2 个答案:

答案 0 :(得分:1)

从代码中排除所有Mage::,只是将数据转储到文件而不进行处理。并了解内存在执行此操作时会发生什么。然后开始逐个添加Mage::函数,看看它何时中断。

这样你就会找到罪魁祸首。然后你需要开始深入研究它的实现,看看会出现什么问题。您也可以考虑在不依赖Mage::电话的情况下进行处理。 只需编写简单的代码来处理自包含函数/类中的数据,并比较如果将Mage::完全排除在流程之外的事情。

答案 1 :(得分:0)

是的 - 当涉及内存管理和推动其面向对象模型边缘的代码时,PHP有很长的非理想行为历史。

您可以尝试alternate method查询浪费较少内存的数据,或者read up了解Magento核心团队如何处理同一问题。