2

我的平台是 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 函数会导致内存泄漏吗?

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

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

谢谢

4

2 回答 2

1

从您的代码中排除所有Mage::内容,并将数据转储到文件中而不进行处理。看看在执行此操作时内存会发生什么。然后开始Mage::一一添加功能,看看它何时中断。

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

于 2013-07-28T06:22:07.037 回答
0

是的——当涉及到内存管理和推动其面向对象模型边缘的代码时,PHP 长期以来一直存在非理想行为。

您可以尝试另一种查询数据的方法,以减少内存浪费,或者您可以阅读Magento 核心团队如何处理同样的问题。

于 2013-07-28T06:42:08.023 回答