我正在使用 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 个产品的站点。我想知道的是以下内容:
任何帮助将非常感激。至少如果我知道我正在正确使用代码,我可以查看其他途径。
提前致谢!
================ 编辑 ==================
使用 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 call 似乎并没有以同样的方式工作,即使产品都设置了图像。
我在 var_dump 中遇到的错误是:
产品图片库中不存在请求的图片。
有人知道为什么现在会发生这种情况吗?再次提前致谢。
最佳答案
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 并通过构建 绕过一部分 Magento 堆栈。您自己的 API .这不一定是一个复杂的解决方案:它可以是一个带有 HTTP 基本身份验证的简单 PHP 脚本,用于解析过滤条件等的 URL,包括 app/Mage.php 并调用 Mage::app() 来初始化 Magento框架。好处是您可以轻松地使用 Magento 类,但您不必经历整个路由过程。
别忘了,你可以缓存结果 因为我可以想象您会向其他域上的相当多的访问者展示相同的产品。即使缓存几分钟也可能对您的服务器有所帮助。
3. 会不会有其他因素让这一切变得如此缓慢?
可能有一些原因导致您的服务器上的调用如此缓慢 - 但如果不知道您的数据量、您的服务器硬件和您所做的定制,即使是最好的猜测也不会那么好。
关于api - 使用 Magento API 获取产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8791834/