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

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

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

这里's an example of the page loading with only 20 or so SKU'(可能有点慢,这个安装根本没有优化):http://crunchconcepts.com.au/test_store/magento/

类别结构如下:

滑块(id = 3)

  • PS3

  • 精选

  • 最新添加

  • 特价促销

  • Xbox

  • 精选

  • 最新添加

  • 特价促销

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

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

它目前正在VPS上运行,当尝试重新调整滑块产品时,服务器负载可能会上升到7-8 .

任何人都可以看到为什么会发生这种情况,我能做些什么来解决这个问题?

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

Update:

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

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

".$mainCatName; foreach($children2 as $tabs){ $tab = Mage::getModel('catalog/category')->load($tabs); echo "

".$tab->getName()."
"; $_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)

2 years ago

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

这样的事情会稍微合适一些 .

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

然后,您可以遍历该产品集合 .

BUT it should really be bundled into its own extension 并给出了特定作业的块和模型 - 您可以以编程方式将变量传递给它,使代码模块化并可重复使用 .

那么这意味着你只需要1个模板文件就可以在你需要的地方做一些简单的事情

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

2 years ago

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

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