проблема памяти magento, не может удалить объекты - PullRequest
1 голос
/ 02 июня 2011

Я пишу экспортер продукта magento, который записывает пару атрибутов в файл csv. один атрибут называется «строкой категории», а его метод выглядит следующим образом:

...
foreach($products as $_product) {       
        ...

        $productId      = $_product->getSku();
        $productCategory    = getCategoryString($_product['category_ids']);
        ...
}
...

function getCategoryString($numbers) {

    $catString = '';
    $catModel = Mage::getModel('catalog/category')->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID);

    $ex = explode(',', $numbers);

    foreach ($ex as $i =>  $e) {

        if ($i > 0) {

            $catString .= $catModel->load($e)->getName();

            if ($i < (count($ex)-1))
                $catString .= ' > ';
        }
    }

    $ex = NULL;
    $numbers = NULL;

    $catModel->unsetData();
            unset($catModel);
            $catModel = NULL;

    return $catString;
}

но после каждой итерации вызов метода стоит около 1 МБ для каждого продукта, а у меня около 9000 продуктов! я не могу очистить переменную $ catModel! строки $ catModel = NULL и unset ($ catModel) не имеют никакого эффекта. Что я делаю неправильно? Как я могу заставить сбросить объект?!

Ответы [ 2 ]

1 голос
/ 02 июня 2011

У нас была та же проблема с хроном для Magento, я знаю, что это не лучший способ сделать это, но нам нужно было сделать это быстро.

Нашим решением было создание нового PHP-файла с кодом, необходимым для выполнения одной операции. Из magento мы получаем список продуктов, а затем вызываем exec () к этому внешнему PHP-файлу продукта по продукту.

Примерно так:

foreach($products as $_product) {       
        ...

        exec("do_the_work.php {$_product->getSku()}");

        ...
}

Надеюсь, это поможет.

0 голосов
/ 02 июня 2011

так что ваш скрипт будет намного круче, если вы

  1. получите все идентификаторы каталога из всех продуктов, которые у вас есть в виде массива
  2. загрузите коллекцию категорий с помощью предложения IN ()с нужными названиями категорий
  3. еще раз просмотрите вашу коллекцию продуктов и выберите необходимые идентификаторы категории из предварительно загруженной коллекции только с нужными элементами
  4. profit $$$$, потому что вы не используете памятькак его неограниченный для вас

гораздо более крутой вещью было бы объединение названий категорий непосредственно в коллекцию продуктов, что потребляло бы еще меньше ресурсов

...