【问题标题】:Using Magento API to get Products使用 Magento API 获取产品
【发布时间】:2012-01-09 16:37:17
【问题描述】:

我正在使用 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. 是否还有其他因素导致进展如此缓慢?

任何帮助将不胜感激。至少如果我知道我正确使用了代码,我可以看看其他途径。

提前致谢!

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

使用 Matthias Zeis 建议的多重调用,数据可以更快地到达。这是我使用的代码:

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

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

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

【问题讨论】:

  • Magento API 非常慢。请提供有关 Magento 中的数据量(SKU 数量、商店浏览量)和使用的硬件的一些信息...
  • @Adam Moss 您尝试了多重通话。您知道获取生成的 XML 的方法吗?我正在编写 PHP 之外的应用程序并需要原始 SOAP
  • @baash05 有点晚了,但是你可以从 PHP 运行一些 multiCall 命令并使用 wiki.wireshark.org/XML Wireshark 或类似的东西来观察输出

标签: api magento product soap-client


【解决方案1】:

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 ... */
    );
}

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

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

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

3.会不会有其他因素导致进展如此缓慢?

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

【讨论】:

  • 首先,感谢您非常详细和有益的回复。我按照您的建议尝试了多重通话,现在事情进展得更快 - 请参阅上面的编辑。出于某种原因,我在使用产品图像调用时遇到问题,因为它不断返回错误消息,而其余数据到达时没有问题。任何想法为什么会发生这种情况?再次感谢:) !!
  • 不客气!错误信息是什么?请同时检查 var/log 和 var/report 中的日志是否有错误。
  • 当我 var_dump 我得到的结果时,数组中的每个项目都会显示以下消息:产品图片库中不存在请求的图片。
  • 我从来没有遇到过这个错误。这很奇怪,因为据我所知,此错误不应由 catalog_product_attribute_media.list 触发。即使我将图像文件移开,我也会得到有效的响应。尝试重建索引和缓存。如果这没有帮助,我能给你的唯一建议是开始调试 app/code/core/Mage/Catalog/Model/Product/Attribute/Media/Api.php 中的方法 items()。该方法负责您正在使用的 API 调用。找到原因后请告诉我。
  • @mahdi 请参阅magentocommerce.com/api/soap/catalog/… 如果您还有其他问题,请创建一个新问题。我可以在那里给出更长/更好格式的答案,你也可以得到其他人的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多