1.上面的代码是否正确,只是Magento的API脚本很慢?
您的代码是正确的,但脚本很慢,因为 (a) SOAP API 的速度不是非常快,并且 (b) 您正在对每个产品进行单独的调用。
2.上面的代码不是做我需要的事情的最佳方法吗?
如果您使用 SOAP v1 API 或 XML-RPC,您可以test 多路通话 http://www.magentocommerce.com/wiki/doc/webservices-api/introduction。首先,调用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.是否还有其他因素导致进展如此缓慢?
可能有一些原因导致呼叫失败that你的服务器速度很慢 - 但如果不知道你的数据量、你的服务器硬件和你所做的定制,即使是最好的猜测也不会那么好。