api - 使用 Magento API 获取产品

标签 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 个产品的站点。我想知道的是以下内容:
  • 上面的代码是否正确,只是 Magento 的 API 脚本很慢?
  • 上面的代码不是做我需要的最佳方式吗?
  • 是否还有其他因素使这一切变得如此缓慢?

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

    提前致谢!

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

    使用 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/

    相关文章:

    api - 让谷歌自定义搜索位置感知

    node.js - 我需要帮助尝试通过 Node 服务器的身份验证调用第 3 方 api

    php - 如何查找 Magento 布局文件的来源

    php - 定制产品销售闪光徽章

    wordpress - 在 Woocommerce 产品类别文件中显示最低和最高价格

    javascript - Durandal 的第一个 javascript 项目。尝试从 3rd 方 API 获取数据

    java - 如何从 API 中提取值(value)

    javascript - Magento 中的 CSS 在整个站点范围内应用?

    Magento 2 : Issue with Paypal Payment from outside India

    database - 人们如何创建可重用的数据库?