Magento - 为什么在列表视图中使用直接SQL的自定义块比list.phtml中的直接sql慢?

时间:2013-12-07 15:14:14

标签: mysql magento block

在Magento,我们遇到了极快变化的库存水平和问题。来自各种供应商的产品的交货时间。 我们的产品目录中有超过40万种产品,每天大约有50-1.5万种库存变化,流行的产品每小时都有变化--Magento无法及时跟上这一点。

我们在产品列表(list.phtml),view(view.phtml)和shoppingcart中使用直接sql解决了大部分问题。 这个极其简单的查询访问 - 如果需要 - 我们的数据库中的表格包含每个产品的库存水平,产品状态和交货时间,并在产品旁边显示,以确保我们显示准确的库存和数据。交货时间信息给我们的客户。

查询:

$query = "SELECT external_stock, productstatus, deliveryperiod FROM products_supplierstatus WHERE sku='$sku'";

$data = Mage::getSingleton('core/resource')->getConnection('core_read')->fetchAll($query); 

使用php我们循环通过状态&库存水平,并根据一些因素,我们显示一个tekst,告知客户该产品的预期交货时间。

到目前为止,这么好 - 总是像魅力一样工作并解决了我们的问题。

但是,我们决定将这些例程组合在一个简单的模块中,因此我们可以始终调用相同的块,并且我们能够更轻松地管理交付时间的更改(在1个位置而不是3个位置)。

听起来很容易,所以我们创建了一个小模块并在列表中调用了它。查看页面:

<?php echo $this->getLayout()->createBlock('dynamic/delivery')->setData('prodid', $_product->getId())->setTemplate('dvdo/showdelivery.phtml')->toHtml(); ?> 

也很有用......但是:在列表视图中主要是明显的,页面的加载时间比以前长得多。

我们几乎没有改变查询或php中循环结果并创建html的任何内容。 因为我们需要近乎实时的股票信息,所以我们不会缓存这些块。

这背后的原因是什么? 与在phtml文件中执行几乎相同的代码相比,Magento需要如此多的额外资源才能构建此块吗?

如果有人能指出我正确的方向让这个模块正常工作,我将非常感激!

2 个答案:

答案 0 :(得分:1)

有太多因素可供任何人猜出正确的答案。您需要自己进行配置和调试。这是一些指导。

  1. 可能不是你的想法。 Magento是一个巨大的应用程序,具有许多层次的抽象,彼此交互,有许多不同的交互,通常很难保持正确。您可能已经改变了影响性能的其他因素。这就是您需要调试和配置文件

  2. 的原因
  3. Varien_Profiler的介绍,Magento附带的分析类

  4. 如果您完全删除了dvdo/showdelivery.phtml的内容,那么这是一个空白文件,是否仍会出现性能问题?

  5. 这种情况比您想象的要多吗?块内是一个循环吗? (我们模板中的一些记录可以帮助揭示这一点)

  6. 确切地说,您的模板文件是什么?您的SQL查询使用SKU,但您的块(可能)使用产品ID

  7. 说到产品ID,$_product中的$_product->getId()来自何处?

  8. dynamic/delivery的块类是什么样的? PHP构造函数中有大量操作吗? Magento的_construct方法? prepareLayout方法?

  9. 虽然我有点怀疑,但有可能实例化一个额外的类(你的块),并加载另一个模板文件(phtml)的额外工作,但你的特定系统超过一些{{ 1}}一次打开太多PHP类或文件的阈值。如果您的块实例化处于循环中,则更有可能。

  10. 如果您的原始SQL可能是您的数据库系统(MySQL?)可以轻松应用SQL缓存,但是*nix*中的任何查询都不能轻易地缓存在SQL级别。

  11. 如果你弄明白,一定要更新评论 - 我有兴趣听听它最终是什么。祝你好运!

答案 1 :(得分:0)

我建议您使用.xml创建的块替换$ this-&gt; getLayout() - &gt; createBlock('dynamic / delivery'),方法是将节点和值放在正确的句柄中。

我不确定这些块是否是有条件的。除非它们是条件块,否则使用XML文件更快地实现块创建会更快。