Использование Magento API для получения продуктов - PullRequest
13 голосов
/ 09 января 2012

Я использую Magento API для получения данных о товарах из определенной категории из другого домена.Я сделал вызов API и т. Д. Код, который я сейчас использую для получения данных о продукте, выглядит следующим образом:

$productList = $client->call($session, 'catalog_category.assignedProducts', 7);

foreach ($productList as $product){
    $theProduct = array();
    $theProduct['info'] = $client->call($session, 'catalog_product.info', $product['sku']);
    $allProducts[] = $theProduct;
}

Код работает нормально, но работает очень медленно.Когда я добавляю вызов изображения в цикл, загрузка страницы занимает около 50 секунд, а это сайт только с 5 продуктами.Я хочу знать следующее:

  1. Является ли приведенный выше код правильным, и просто API-скрипт Magento работает очень медленно?
  2. Не является ли приведенный выше код не лучшим способомМне нужно?
  3. Могут ли быть какие-то другие факторы, делающие это настолько медленным?

Любая помощь будет принята с благодарностью.По крайней мере, если я знаю, что я правильно использую код, я могу посмотреть на другие пути.

Заранее спасибо!

================= РЕДАКТИРОВАТЬ =================

При использовании мультивыступления, предложенного Матиасом Цейсом, данные поступают намного быстрее.Вот код, который я использовал:

$apicalls = array();
$i = 0;
$productList = $client->call($session, 'catalog_category.assignedProducts', 7);

foreach ($productList as $product){
$apicalls[$i] = array('catalog_product.info', $product['product_id']);
$i++;
}

$list = $client->multiCall($session, $apicalls);

Теперь это работает намного быстрее, чем раньше!Следующая проблема, которую я обнаружил, заключается в том, что catalog_product_attribute_media.list , кажется, не работает одинаково, даже если во всех продуктах установлены изображения.

Ошибка I 'я получаю в var_dump:

Запрошенное изображение не существует в галерее изображений продуктов.

Кто-нибудь знает, почему это может теперь происходить?Еще раз спасибо заранее.

1 Ответ

18 голосов
/ 09 января 2012

1. Является ли приведенный выше код правильным, и это просто API-скрипт Magento очень медленный? Ваш код правильный, но сценарий медленный, потому что (a) API SOAP не слишком быстр и (b) вы делаете отдельные вызовы для каждого продукта.

2. Разве приведенный выше код не лучший способ сделать то, что мне нужно?

Если вы используете SOAP v1 API или XML-RPC, вы можете проверить multiCall . Сначала вызовите catalog_category.assignedProducts для получения идентификаторов продуктов. Соберите идентификаторы продукта и выполните вызов multiCall. Это должно немного сократить время ожидания.

К сожалению, Magento не предоставляет из коробки хорошее решение для доставки данных так, как вам нужно. Я рекомендую вам реализовать свой собственный вызов API .

Используйте модель коллекции продуктов:

$collection = Mage::getModel('catalog/product')->getCollection();

Это даст вам объект Mage_Catalog_Model_Resource_Product_Collection, который можно использовать для фильтрации, сортировки, разбивки на страницы ... вашего списка продуктов. Переберите коллекцию и создайте массив, содержащий нужные данные. Вы также можете создавать миниатюры для своих продуктов непосредственно при создании массива данных:

foreach ($products as $product) {
    $data[$product->getSku()] = array(
        /* the attributes no need ... */
        'small_image'   => Mage::helper('catalog/image')->init($product, 'image')
                                ->constrainOnly(true)
                                ->keepAspectRatio(true)
                                ->keepFrame(false)
                                ->resize(100,150)
                                ->__toString(),
        /* some more attributes ... */
    );
}

Это должно дать вам значительное улучшение производительности.

Но, конечно, это только верхушка айсберга 1030 *. Если это решение недостаточно быстрое, избегайте SOAP и обходите часть стека Magento, создав свой собственный API . Это не должно быть сложным решением: это может быть простой PHP-скрипт с HTTP Basic Authentication, который анализирует URL-адреса для критериев фильтрации и т. Д., Включает app / Mage.php и вызывает Mage :: app () для инициализации Magento. фреймворк. Преимущество заключается в том, что вы можете комфортно пользоваться классами Magento, но вам не нужно проходить весь процесс маршрутизации.

Не забывайте, что вы можете кэшировать результаты , потому что я могу представить, что вы покажете те же продукты довольно многим посетителям в другом домене. Даже кеширование на несколько минут может помочь вашему серверу.

3. Могут ли быть какие-то другие факторы, делающие это настолько медленным?

Могут быть некоторые причины, по которым вызовы медленнее на вашем сервере , но без знания объема ваших данных, аппаратного обеспечения вашего сервера и настроек, которые вы сделали, даже самая лучшая догадка не будет будь так хорош.

...