Ответ 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. Могут ли быть какие-то другие факторы, делающие это настолько медленным?
Могут быть некоторые причины, по которым вызовы медленны на вашем сервере - но, не зная объема ваших данных, вашего серверного оборудования и сделанных вами настроек, даже лучшее предположение не будет таким хорошим.