Opencart加载速度极慢

时间:2012-03-28 21:29:51

标签: performance categories opencart

我在我的服务器上运行Opencart 1.5.2,在导入大量产品后,我的速度大了很快。我尝试安装vq mod,这必须加快网站的速度......但事实并非如此。

Store

我知道网站上有一些相对较大的元素,但在导入之前运行正常。

9 个答案:

答案 0 :(得分:11)

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

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

默认主题还有一个产品计数显示在网站的主菜单中。您可以在 catalog / controller / common / 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()的其他引用,请确保不删除使用产品计数进行分页的引用,否则分页将无法正常工作。以下是 catalog / controller / product / search.php 的示例,该文件需要产品计数才能正常运行。

$pagination->total = $product_total;

在开放式安装中,删除这些引用使我的开发服务器的页面加载时间增加了近10倍,其中包含约2,000种产品。

答案 1 :(得分:11)

如果您的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. Index on manufacturer_id column in product table
  7. Index on language_id column in product_description table
  8. Index on store_id column in product_to_store table
  9. 此外,正如其他答案中所述,我还删除了产品计数:catalog/controller/product/category.phpcatalog/controller/module/categories.php。 如果仍然遇到缓慢,您可以从侧栏完全禁用类别模块。

    最后,您可以尝试使用此扩展程序:http://www.opencart.com/index.php?route=extension/extension/info&extension_id=10464,但它不支持seo url,所以我不得不稍微调整一下(通过解码$_REQUEST['_route_']参数,其中包含seo url request,in function run)。

答案 2 :(得分: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 ##`

答案 3 :(得分:1)

在我工作的商店中,版本1.5.6.4_rc(我很确定也适用于您的版本)问题出在以下问题:

在第33行的目录/ controller / module / category.php中的foreach($ categories as $ category)

foreach(在第107行的目录/ controller / common / header.php中$ category作为$ category

由于该代码,我们有超过900个数据库查询,其中许多来自$ this-&gt; url-&gt; link()以及其他各种查询。

我们通过缓存此类别数据创建了一个vqmod来解决此问题,所以至少只有在缓存重新生成时才会发生:

<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

答案 4 :(得分:0)

查看catalog/controller/module/categories.php。默认情况下,类别模块显示菜单中每个项目旁边的产品计数。对于非常小的ux增益,这会产生相当大的查询开销(在我看来)。

该行

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

出现两次,如果您将其评论出来(以及在其下方使用$product_total),您应该会看到非常显着的收益。

答案 5 :(得分:0)

也许您需要全页面缓存而FPC是通过创建加载而不是全部opencart框架来加速您的商店。此扩展程序将缓存所有目录页面,但会保持用户特定信息的动态。

链接:Full Page Cache

答案 6 :(得分: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

如果您有任何问题,请告诉我,我会尽力帮助。

答案 7 :(得分:0)

这是为我解决的问题。正如之前的海报所提到的那样,减速的一个主要原因是:

catalog / model / catalog / product.php - &gt; 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'];
}

通过这样做,您不必对任何内容发表评论,但如果会话处于活动状态时更新产品将会出错。

希望有所帮助。

答案 8 :(得分:0)

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