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