2012-03-28 370 views
5

我在我的服务器上运行Opencart 1.5.2,导入了大量的产品后,我得到了大幅度的降速。我试图安装一个vq mod,它不得不加速网站......它没有。Opencart极慢的加载速度

Store

我知道我有在网站上的一些元件,其比较大的,但它运行良好导入前。

+0

我知道已经有一些答案,但有帮助的是有一个专用的服务器盒和专用的数据库服务器。 – TheBlackBenzKid 2013-08-13 21:53:49

回答

11

类别中的产品数量是opencart缓慢页面加载的重要来源。有几个地方可以计算出来,你必须摆脱所有这些才能注意到由于这个因素导致页面加载时间的改进。

如果您编辑Catalog模块,则可以通过将Product Count:设置为Disabled来禁用导航菜单的产品计数(默认显示在左侧列中)。

默认主题还有一个产品数量显示在网站的主菜单中。您可以在目录/控制器/通用/ header.php文件找到这段代码:

$product_total = $this->model_catalog_product->getTotalProducts($data); 

$children_data[] = array(
    'name' => $child['name'] . ' (' . $product_total . ')', 
    'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id']) 
); 

删除或任何引用注释掉$product_total

//$product_total = $this->model_catalog_product->getTotalProducts($data); 

$children_data[] = array(
    'name' => $child['name'], 
    'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id']) 
); 

这应该在采取所有引用的护理一个默认的opencart安装,但如果您使用的是自定义主题或模块,则可能会有更多。更一般地说,您可以搜索整个目录/目录以参考model_catalog_product->getTotalProducts()

如果您搜索对getTotalProducts()的其他参考请确保您不要删除使用产品数量进行分页的参考文献,否则分页将无法正常工作。以下是目录/控制器/产品/ search.php的示例,该文件需要产品数量才能正常运行。

$pagination->total = $product_total; 

删除这些引用,导致近10倍的加速页面加载时间上在Opencart的我的开发服务器与2000〜安装产品。

0

看一看catalog/controller/module/categories.php。默认情况下,类别模块显示菜单中每个项目旁边的产品数量。这导致了一小部分的查询开销,以获得非常小的增益(在我看来)。

线

$product_total = $this->model_catalog_product->getTotalProducts($data); 

,如果你把它注释掉(何$product_total使用它下面),你应该看到漂亮显著的收益出现了两次。

9

把它整理出来。在OC团队发现的SQL查询中似乎有一种“新”的方法,它应该被称为“DDoS自己死”。

产品基地现在已经发展到129个类别的37k产品(从18k整夜起,大声笑......不应该编写自动化导入脚本并将其交给lamer ...)和加载时间从6-12秒生长至20-25秒,击中硬SQL服务器:

[报价]Вопросовначинаясзапуска:自启动514064911(疑问句) øвчас:1301788(疑问句平均为小时) øвминуту:21696(为分钟疑问句平均) øвсекунду:362(用于第二疑问句平均) [/报价]

这是不正常的,因为有2个系统中的用户 - 自动化脚本(限于每秒30个问题,然后是睡眠(1))和我(每个人?WTF开发人员每秒362-30个查询?)。根据这一统计数据,OC以这种方式将需要一个严重的服务器场,以同时为500多个用户提供服务。不会发生。不在今生。

我确实维护了各种网站,并且改写了几乎所有的网站。我访问量最大的网站(每天20万次访问)每天只产生2.5亿个问题。它有很多(内容),相信我。如果OC平均加载(200k次观看),这意味着每天将有100-120个问题。

此外,查询不明智,使用ORDER BY(正如我怀疑的)和SELECT DISTINCT(疼痛!!!)给服务器带来困难时期。

同样,每个查询都有很多选项,无论它们是否由用户设置(排序,排序等)。这使得问题比预期的长4-5倍,即使用户不想要任何排序顺序(ASC,DESC等)。

也有问题写在这样一个坏的方式,这让我感到好笑。你怎么能拉动总数什么通过使用5 phps和3查询,只要你可以做简单的1行“SELECT COUNT(*)FROM ...”? OC团队似乎不关心执行时间和服务器负载。

我想道歉,如果有人被我写的东西冒犯了,但在我的情况下,我是对的:整个方法对于实现目标(37k产品/ 129猫的快速执行)是错误的。 OC可能对2类和50类产品有好处(lol?)。不知道。我可能不会知道。

作为信息缓存不是解决方案。服务器端缓存是相当不错的。除此之外的任何事情意味着你有严重的编码问题。所以不要......我会重复不要购买缓存模块。隐藏问题,而不是解决问题。如果一个缓存模块可以隐藏40k产品的问题,它将无法在140k产品中完成。您将需要缓存模块,缓存模块,哈哈。

现在来解决。简单的方法。我们只会修改主要问题。我不会解释我对我的版本所做的修改,因为它们存在于很多文件中,而且如果你不明白你在做什么,这些修改就很重要(你可能会丢失你想保留的OC选项,而我不在乎关于选项,只要该网站正在加载半分钟)。所以 - 只需稍作修改。

Wil说 - 版本1.5.5.1股票,股票主题解释。手段 - 没有mods。修改后,您将左侧的块放置类别,但您的网站将加载真正快速(37k产品/ 129猫 - > 0.137秒平均5个负载,服务器距离约200米)

0)备份您的网站。我们将修改文件。你可以做一个可怕的混乱。然后哭了。

1)获取/目录/控制器/产品/类别。PHP 查找路线:184

必须包含:$product_total = $this->model_catalog_product->getTotalProducts($data);

替换为://$product_total = $this->model_catalog_product->getTotalProducts($data);

说明:注释掉类别计算,因为它需要相当DAMD多少数量的产品129类(129个查询跆拳道。? ?)

2)获取/catalog/controller/product/category.php 查找路线:187

必须包含:'name' => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : '')

替换为:'name' => $result['name'],

说明:清理 - 有在类别中显示无算,因为我们不`吨再指望他们。

3)获取/catalog/controller/product/category.php 查找路线:388 必须包含:'common/column_left',

替换为:// 'common/column_left',

说明:该类别中左侧立柱Skippng代视图。

4)获取/catalog/controller/product/product.php 查找路线:463 必须包含:'common/column_left',

替换为:// 'common/column_left',

说明:在产品视图左侧立柱Skippng代。

5)获取/store/catalog/view/theme/default/template/product/product.tpl 查找线路:1

必须包含:<?php echo $header; ?><?php echo $column_left; ?><?php echo $column_right; ?>

替换为:<?php echo $header; ?><?php echo $column_right; ?>

说明:从主题 - 产品视图中删除左列。

6)获取/store/catalog/view/theme/default/template/product/category.tpl 查找线路:1

必须包含:<?php echo $header; ?><?php echo $column_left; ?><?php echo $column_right; ?>

替换为:<?php echo $header; ?><?php echo $column_right; ?>

说明:从主题 - 目录视图中删除左列。

DONE。测试你的负载速度。如果你的问题和我一样,应该是相当惊人的。

注意:请注意,我不熟悉OC的版本并从未使用过。由于我们解决了部分问题,因此尚未完全解决。这是一个临时修复。删除导致缓慢加载的部分是一种解决方案,直到您再次写入它们,这次希望更好。如果有人想要高出我的老板,我愿意重写它。我可以休假并为你工作:)我的付款目前每周4700欧元。以正确的方式理解和重写此左栏不应超过1-2个工作日。

PP。将在几个地方发布,因为我不认为OC开发团队会喜欢他们阅读的内容,不管我不想冒犯他们 - 只是为了指出他们所犯的严重错误(平均加载时间为25.31对于测试中的每个页面 - 在离开另一个站点之前,没有客户会等待超过3-4秒!Dafuq?)。通过不让我发布这些信息,人们不知道如何解决问题,并购买一个“缓存模块”,它实际上像在野外一样在硬盘上刻录文件。浪费金钱,浪费硬盘资源,浪费电力......所有这些 - 为了创造幻想,一切运行良好,而事实并非如此。

+0

对许多核心变化 – TheBlackBenzKid 2013-03-26 14:55:01

+0

这种方法有很大帮助。谢谢! – 2016-05-29 14:32:55

+1

把它整理出来。在OC团队发现的SQL查询中似乎有一种“新”的方法,它应该被称为“DDoS自己死”。 +1 – Jordy 2016-11-04 09:38:23

0

也许你需要整页缓存又名FPC是通过创建简单的文件来加载而不是所有的opencart框架来加快你的商店。该扩展将缓存您的所有目录页面,但会保持用户特定的信息动态。

链接:Full Page Cache

0

我找到了另一个解决问题的办法。基本上,当MySQL试图同时过滤来自Product_category和Product_Tag表的查询结果时,它会窒息。我为OC 1.5.2.1写了一个vqMod,它取代了getTotalProducts()函数,并构造了针对2个表执行的单个SQL查询。然后它使用SQL UNION将两个查询的结果组合在一起。该解决方案可提高性能,并允许您在网站上继续使用产品计数器。

这使我的页面加载时间从45秒减少到50秒,只有不到1秒!

我刚刚发布了vqMod文件位置:http://www.opencart.com/index.php?route=extension/extension/info&token=7bc7d0149c7101c3d336b2e0b29e3f03&extension_id=13155

让我知道,如果你有任何问题,我会帮助在那里我可以。

10

如果您在您的opencart中启用了seo urls,则它可能是缓慢的重要来源。

我有oc v1.5.5.1约3K类别和40K产品。我在共享主机上运行它,起初我的加载时间大约是40秒或更长。然后我进一步了解了opencart,并意识到它正在oc数据库中的oc_url_alias表上发出大量请求。所以我的建议是:

1. Add index to query column in oc_url_alias table

有了这个我的加载时间就下到每页约7秒钟。

2. Add index to keyword column in oc_url_alias table

两个步骤后,我得到了它下降到每页约1-3秒。

现在我OC在每页约1秒运行,我实现了在我的MySQL表中多加入一些指标,根据这个家伙的帖子http://bloke.org/php/opencart-is-slow-with-many-categories/,它们是:

  1. Index on parent_id column in category table
  2. Index on category_id column in product_to_category table
  3. Index on language_id column in category_description table
  4. Index on store_id column in category_to_store table
  5. Index on attribute_id AND language_id columns in product_attribute table
  6. catalog/controller/module/categories.php
  7. Index on manufacturer_id column in product table
  8. Index on language_id column in product_description table
  9. Index on store_id column in product_to_store table

此外,在其他的答案上述,我也移除的产品数量。 如果仍然遇到缓慢,您可以完全禁用侧边栏中的类别模块。

最后,你可以尝试使用这个扩展:http://www.opencart.com/index.php?route=extension/extension/info&extension_id=10464,但它不支持的搜索引擎优化的网址,因为它是,所以我不得不调整它一点(由$_REQUEST['_route_']参数,其中包含搜索引擎URL请求的解码,在功能run )。

+0

你好。你能请分享一下seo url fpc的解决方法吗? – geryjuhasz 2013-11-22 16:52:47

1

看一看.htaccess文件,如this tutorial解释说:

`## EXPIRES CACHING ## 
<IfModule mod_expires.c> 
ExpiresActive On 
ExpiresByType image/jpg "access plus 1 week" 
ExpiresByType image/jpeg "access plus 1 week" 
ExpiresByType image/gif "access plus 1 week" 
ExpiresByType image/png "access plus 1 week" 
ExpiresByType text/css "access plus 1 week" 
ExpiresByType application/pdf "access plus 1 week" 
ExpiresByType text/x-javascript "access plus 1 week" 
ExpiresByType application/x-shockwave-flash "access plus 1 week" 
ExpiresByType image/x-icon "access plus 1 week" 
ExpiresDefault "access plus 1 week" 
</IfModule> 
## EXPIRES CACHING ##` 
1

在商店,我的工作是版本1.5.6.4_rc(我敢肯定适用加时赛您的版本太)的问题是用下列:

的foreach($类别为$类别)在目录/控制器/模块/ category.php围绕线33

的foreach($类别如在目录/控制器/通用/报头$类别.php在线107

由于这段代码,我们从$ this-> url-> link()以及其他各种查询中搜索了900多个db查询。

我们创建了一个vqmod通过缓存这一类数据,以便ATLEAST当缓存再生只会发生在解决这个问题:

<modification> 

    <id>Cache category data to speed up page load for store with many categories and sub categories.</id> 
    <version>1.0.0</version> 
    <vqmver>2.3.2</vqmver> 
    <author>Weismann Web</author> 

    <file name="catalog/controller/module/category.php"> 
     <operation> 
      <search position="after"><![CDATA[ 
      foreach ($categories as $category) { 
      ]]></search> 
      <add><![CDATA[ 
      $category_data = $this->cache->get('vqmod_category_data_controller_module_category'); 

      if ($category_data) { 
       $this->data['categories'] = $category_data; 
       break; 
      } 
      ]]></add> 
     </operation> 
     <operation> 
      <search position="before"><![CDATA[ 
      if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/category.tpl')) { 
      ]]></search> 
      <add><![CDATA[ 
      if (!$category_data) { 
      $this->cache->set('vqmod_category_data_controller_module_category', $this->data['categories']); 
      } 
      ]]></add> 
     </operation> 
    </file> 

<file name="catalog/controller/common/header.php"> 
     <operation> 
      <search position="after"><![CDATA[ 
      foreach ($categories as $category) { 
      ]]></search> 
      <add><![CDATA[ 
      $category_data = $this->cache->get('vqmod_category_data_controller_common_header'); 

      if ($category_data) { 
       $this->data['categories'] = $category_data; 
       break; 
      } 
      ]]></add> 
     </operation> 
     <operation> 
      <search position="before"><![CDATA[ 
      $this->children = array(
      ]]></search> 
      <add><![CDATA[ 
      if (!$category_data) { 
      $this->cache->set('vqmod_category_data_controller_common_header', $this->data['categories']); 
      } 
      ]]></add> 
     </operation> 
    </file> 


</modification> 

这是我的一篇关于它的Opencart的论坛:Issue With Slow Opencart When Having Lots of Categories

0

这是为我修复的。正如以前的海报提到的主要原因是:

catalog/model/catalog/product.php - > public function getTotalProducts($ data = array()){ ...

在函数开始将这个方法:将本末

public function getTotalProducts($data = array()) { 
    if (isset($_SESSION['totalproducts'.$_SERVER['QUERY_STRING']])){ 
     return $_SESSION['totalproducts'.$_SERVER['QUERY_STRING']]; 
    } 

$_SESSION['totalproducts'.$_SERVER['QUERY_STRING']] = $query->row['total']; 
    return $query->row['total']; 
} 

通过这样做,你没有发表评论任何东西了,但总的产品将如果会话处于活动状态时更新,则会出错。

希望有所帮助。

0

您应该为OC_URL_ALIAS表中的关键字和查询列创建02个索引。速度让您印象深刻。 我使用Google的PageSpeed Insight来衡量我网站的速度。 第一次,结果是“在我们的测试中,您的服务器在12.2秒内响应”。创建两个索引后,响应时间为7.8秒:)