使用Magento API获取产品

Ada*_*oss 13 api product soap-client magento

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但速度非常慢.当我将图像调用添加到循环时,页面加载大约需要50秒,而这只适用于只有5个产品的网站.我想知道的是以下内容:

  1. 上面的代码是否正确,只是Magento的API脚本非常慢?
  2. 上面的代码不是做我需要的最好方法吗?
  3. 还有其他任何因素会导致这么慢吗?

任何帮助将非常感激.至少如果我知道我正在使用正确的代码,我可以看看其他途径.

提前致谢!

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

使用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);
Run Code Online (Sandbox Code Playgroud)

现在这比以前快得多!我发现的下一个问题是,catalog_product_attribute_media.list调用似乎没有以相同的方式工作,即使产品都设置了图像.

我在var_dump中得到的错误是:

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

有谁知道为什么现在可能会发生这种情况?再次感谢您的提前.

Mat*_*eis 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();
Run Code Online (Sandbox Code Playgroud)

这将获得一个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 ... */
    );
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

3.还有其他任何因素会导致这么慢吗?

可能有一些原因的电话是缓慢的服务器上-但不知道你的数据量,你的服务器硬件和客户化你所做的一切,即使是最好的猜测也不会好.