在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需要如此多的额外资源才能构建此块吗?
如果有人能指出我正确的方向让这个模块正常工作,我将非常感激!
答案 0 :(得分:1)
有太多因素可供任何人猜出正确的答案。您需要自己进行配置和调试。这是一些指导。
可能不是你的想法。 Magento是一个巨大的应用程序,具有许多层次的抽象,彼此交互,有许多不同的交互,通常很难保持正确。您可能已经改变了影响性能的其他因素。这就是您需要调试和配置文件
Varien_Profiler
的介绍,Magento附带的分析类
如果您完全删除了dvdo/showdelivery.phtml
的内容,那么这是一个空白文件,是否仍会出现性能问题?
这种情况比您想象的要多吗?块内是一个循环吗? (我们模板中的一些记录可以帮助揭示这一点)
确切地说,您的模板文件是什么?您的SQL查询使用SKU,但您的块(可能)使用产品ID
说到产品ID,$_product
中的$_product->getId()
来自何处?
dynamic/delivery
的块类是什么样的? PHP构造函数中有大量操作吗? Magento的_construct
方法? prepareLayout
方法?
虽然我有点怀疑,但有可能实例化一个额外的类(你的块),并加载另一个模板文件(phtml
)的额外工作,但你的特定系统超过一些{{ 1}}一次打开太多PHP类或文件的阈值。如果您的块实例化处于循环中,则更有可能。
如果您的原始SQL可能是您的数据库系统(MySQL?)可以轻松应用SQL缓存,但是*nix*
中的任何查询都不能轻易地缓存在SQL级别。
如果你弄明白,一定要更新评论 - 我有兴趣听听它最终是什么。祝你好运!
答案 1 :(得分:0)
我建议您使用.xml创建的块替换$ this-&gt; getLayout() - &gt; createBlock('dynamic / delivery'),方法是将节点和值放在正确的句柄中。
我不确定这些块是否是有条件的。除非它们是条件块,否则使用XML文件更快地实现块创建会更快。