Подтвердить что ты не робот

Использование Magento API для получения продуктов

Я использую API Magento для получения данных о продукте для продуктов определенной категории из другого домена. Я сделал вызов 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 продуктов. Я хочу знать следующее:

  • Правилен ли код выше, и только Magento API script работает очень медленно?
  • Является ли код выше не лучшим способом делать то, что мне нужно?
  • Могут ли быть какие-то другие факторы, делающие это настолько медленным?

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

Спасибо заранее!

================= EDIT ========================

Используя multicall, предложенный Matthias Zeis, данные поступают гораздо быстрее. Вот код, который я использовал:

$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, похоже, не работает одинаково, хотя все продукты имеют установленные изображения.

Ошибка, которую я получаю в var_dump:

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

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

4b9b3361

Ответ 1

1. Является ли код выше правильного, и только Magento API script работает очень медленно?

Ваш код верен, но script медленный, потому что (а) API SOAP не очень быстро и (б) вы делаете отдельные вызовы для каждого отдельного продукта.

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

Если вы используете API-интерфейс SOAP v1 или 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 ... */
    );
}

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

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

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

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

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