Magento自定义块需要很长时间才能加载大量SKU

时间:2012-03-08 11:12:06

标签: php magento

我有一个自由职业者代码块,显示特色产品的滑块,其中的选项卡对应于其中的子类别。

.phtml文件在这里:http://pastebin.com/6jEexZxu

以下是仅加载20个SKU的页面加载示例(可能有点慢,此安装尚未优化):http://crunchconcepts.com.au/test_store/magento/

类别结构如下:

  

滑块(id = 3)

- > PS3

- >精选

- >最新添加

- >待售

- >的Xbox

- >精选

- >最新添加

- >待售

......等等。这会自动为“Slider”的任何子类别加载一个新滑块,并为每个子子类别添加一个新选项卡。

这很好用(虽然当商店只有100个左右的SKU时,点击下一个标签会按需加载产品会更好),但是当我们导入1000个测试SKU时,页面加载仅在主页上挂起被访问。商店在所有其他页面和功能上都运行良好,只有当从主页中删除滑块时,它才会恢复正常速度。

此刻它正在VPS上运行,当尝试重新启动滑块产品时,服务器负载可能会上升到7-8。

任何人都可以看到为什么会这样,我可以做些什么来解决这个问题?

自由职业者基本上已停止回复电子邮件,因为他有钱,所以他的建议已经不合时宜了!

更新

好的,所以我想从头开始,我想我已经到了那里......或者,至少,我正在学习很多东西!

    <?php
$categoryId = 3; // a category id that you can get from admin
$category = Mage::getModel('catalog/category')->load($categoryId);

$parentCat = Mage::getModel('catalog/category')->load($categoryId);
$childCategories = $parentCat->getChildren(); //Child category IDs separated by commas

$children1 = explode(',', $childCategories);

foreach ($children1 as $subCat1){
echo "<br/>";

$parentCat1 = Mage::getModel('catalog/category')->load($subCat1);
$childCategories1 = $parentCat1->getChildren(); //Child category IDs separated by commas
$mainCatName = $parentCat1->getName();
$children2 = explode(',', $childCategories1);
echo "<br/><br/>".$mainCatName;






foreach($children2 as $tabs){


$tab = Mage::getModel('catalog/category')->load($tabs);
echo "<br/><br/>".$tab->getName()."<br/>";

$_category = Mage::getModel('catalog/category')->load($tabs);
$_productCollection = Mage::getResourceModel('catalog/product_collection')
  ->addStoreFilter()
  ->addCategoryFilter($_category)
  ->addAttributeToSelect(array('name','url','small_image'));  


    if(!empty($_productCollection))

    {

            foreach ($_productCollection as $_product):

            echo $_product->getName();   //get product name  

        endforeach;

    }else{
    echo "nothing!";}


}


}


  ?>

我有这个,它显示了类别名称和ID,但每当我尝试加载产品时,它会加载商店中的每个产品!我尝试了其他几种方法,但它从随机类别中加载了错误的产品。救命啊!

2 个答案:

答案 0 :(得分:1)

需要改变方法。像这样的代码不应该在phtml模板文件中。这需要重写为适当的Magento模块,Block类执行所有集合检索和过滤以获得您想要的内容。而phtml只显示您的产品滑块显示。此外,还可以添加适当的块缓存,以便在启用缓存时在有限时间内加载页面。

几乎不需要在标准Magento实体(如产品)上执行原始SQL。 Magento在资源模型中提供了大量的收集过滤器,可用于在给定一组条件的情况下检索产品及其信息。此外,需要特别注意测试此类代码,同时启用平面目录类别和产品,以确保您可以使用此模式,因为它可以提高大量SKU的Magento存储性能。

答案 1 :(得分:0)

它很慢,因为你使用大量结果集运行多个查询,然后重复加载整个模型。

这样的事情会稍微更合适。

$_catId = 999;
$_category = Mage::getModel('catalog/category')->load($_catId);
$_productCollection = Mage::getResourceModel('catalog/product_collection')
  ->addStoreFilter()
  ->addCategoryFilter($_category);

然后您可以遍历该产品系列。

但它应该真正捆绑到自己的扩展并给出特定作业的块和模型 - 您可以以编程方式将变量传递给它,使代码模块化并可重复使用。 / p>

然后它意味着你只需要一个模板文件,并且可以在任何你需要的地方做一些简单的事情

{{block type='mynamespace/mymodule' template='mymodule/slider_template.phtml' cat_id="5" limit="3"}}