使用Magento API获取产品

时间:2012-01-09 16:37:18

标签: api magento product soap-client

我正在使用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. 上面的代码是否正确,只是Magento的API脚本非常慢?
  2. 上面的代码不是做我需要的最好方法吗?
  3. 还有其他任何因素会导致这么慢吗?
  4. 非常感谢任何帮助。至少如果我知道我正在使用正确的代码,我可以看看其他途径。

    提前致谢!

    =================编辑=================

    使用Matthias Zeis建议的multicall,数据到达速度更快。这是我使用的代码:

    $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中遇到的错误是:

    产品图片库中不存在请求的图片。

    有人知道为什么现在可能会发生这种情况吗?再次感谢。

1 个答案:

答案 0 :(得分:18)

<强> 1。上面的代码是否正确,只是Magento的API脚本非常慢?

您的代码是正确的,但脚本很慢,因为(a)SOAP API并不是非常快,(b)您正在为每个产品单独调用。

<强> 2。上面的代码不是做我需要的最好方法吗?

如果您使用SOAP v1 API或XML-RPC,则可以测试multiCall 。首先,调用catalog_category.assignedProducts来获取产品ID。收集产品ID并执行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 ... */
    );
}

这应该会给你带来相当大的性能提升。

但当然这只是冰山一角。如果此解决方案不够快,请通过构建您自己的API 来避免使用SOAP并绕过Magento堆栈的一部分。这不一定是一个复杂的解决方案:它可以是一个带有HTTP基本身份验证的简单PHP脚本,它解析URL以获取过滤条件等,包括app / Mage.php并调用Mage :: app()来初始化Magento框架。好处是您可以轻松使用Magento类,但不必完成整个路由过程。

不要忘记,您可以缓存结果,因为我可以想象您会向其他域上的不少访问者展示相同的产品。即使缓存几分钟也可以帮助您的服务器。

第3。是否还有其他因素导致这种情况变得如此缓慢?

可能有一些原因导致服务器 的调用速度变慢 - 但不知道您的数据量,服务器硬件和您所做的自定义,即使是最好的猜测也是好的。