使用MagentoAPI获取产品

使用MagentoAPI获取产品,api,magento,product,soap-client,Api,Magento,Product,Soap Client,我正在使用MagentoAPI从另一个域获取特定类别产品的产品数据。我已经做了API调用等。。。我当前用于获取产品数据的代码如下所示: $productList = $client->call($session, 'catalog_category.assignedProducts', 7); foreach ($productList as $product){ $theProduct = array(); $theProduct['info'] = $client-&

我正在使用MagentoAPI从另一个域获取特定类别产品的产品数据。我已经做了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脚本非常慢
  • 上面的代码不是做我需要的事情的最佳方式吗
  • 有没有其他因素让这一切进展如此缓慢
  • 任何帮助都将不胜感激。至少如果我知道我使用的代码是正确的,我可以看看其他途径

    提前谢谢

    ================================================================

    使用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);
    
    现在比以前快多了!我发现的下一个问题是,尽管所有产品都设置了图像,但调用的方式似乎并不相同

    我在var_转储中遇到的错误是:

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


    有人知道为什么会这样吗?提前再次感谢。

    1。上面的代码正确吗?只是Magento的API脚本非常慢?

    您的代码是正确的,但脚本速度很慢,因为(a)SOAP API速度不太快,(b)您正在对每个产品分别进行调用

    2。上面的代码不是我所需要的最佳方法吗?

    如果使用SOAPV1 API或XML-RPC,则可以测试。首先,调用catalog_category.assignedProducts获取产品ID。收集产品ID并执行多呼叫。这将大大缩短等待时间

    不幸的是,Magento没有提供一个现成的解决方案来提供您所需要的数据。我建议您实现自己的自定义API调用

    使用产品集合模型:

    $collection = Mage::getModel('catalog/product')->getCollection();
    
    这将为您提供一个Mage\u目录\u模型\u资源\u产品\u集合对象,该对象可用于筛选、排序、分页等。。。你的产品清单。迭代集合并构建包含所需数据的数组。您还可以在构建数据阵列时直接为产品生成缩略图:

    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,并通过构建自己的API来绕过Magento堆栈的一部分。这不一定是一个复杂的解决方案:它可以是一个带有HTTP基本身份验证的简单PHP脚本,它解析URL以获取过滤条件等,包括app/Mage.PHP并调用Mage::app()来初始化Magento框架。好处是您可以轻松地使用Magento类,但不必经历整个路由过程

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

    3。是否还有其他因素使这一进程如此缓慢?


    服务器上的调用速度如此之慢可能有一些原因,但在不知道数据量、服务器硬件和您所做的自定义的情况下,即使是最好的猜测也不会那么好。

    Magento API速度非常慢。请提供有关Magento中数据量(SKU数量、存储视图)和所用硬件的一些信息…@Adam Moss您尝试了multicall。您知道获取生成的XML的方法吗。我正在编写一个应用程序以外的PHP和需要的原始数据SOAP@baash05这里有点晚了,但是您可以从PHP运行一些multiCall命令,并使用Wireshark或类似工具来观看输出。首先,感谢您提供了非常详细和有用的响应。我按照你的建议尝试了multicall,现在事情进展得更快了——请参见上面的编辑。由于某种原因,我在使用product image调用时遇到了一个问题,因为它不断返回错误消息,而其余数据到达时没有问题。你知道为什么会这样吗?再次感谢:)!!不客气!错误消息是什么?还请检查var/log和var/report中的日志是否有错误。当我var_转储我得到的结果时,数组中的每个项目都显示以下消息:请求的图像在产品图像库中不存在。我从未遇到过此错误。这很奇怪,因为在我看来,这个错误不应该由catalog\u product\u attribute\u media.list触发。即使将图像文件移开,也会得到有效的响应。尝试重建索引和缓存。如果这没有帮助,我能给你的唯一建议就是开始调试app/code/core/Mage/Catalog/Model/Product/Attribute/Media/Api.php中的方法items()。该方法负责您正在使用的API调用。找到原因后请告诉我。@mahdi如果您还有其他问题,请创建一个新问题。我可以在那里给出更长/格式更好的答案,你也可以得到其他人的帮助。