Performance Opencart装载速度极慢

Performance Opencart装载速度极慢,performance,categories,opencart,Performance,Categories,Opencart,我在我的服务器上运行Opencart 1.5.2,在导入大量产品后,我的速度大大降低。我试着安装了一个必须加快网站速度的。。。没有 我知道我在网站上有一些相对较大的元素,但在导入之前运行良好。查看目录/controller/module/categories.php。默认情况下,“类别”模块在菜单中每个项目旁边显示产品计数。在我看来,这会导致相当大的查询开销,从而获得非常小的用户体验收益 线路 $product_total = $this->model_catalog_product-&

我在我的服务器上运行Opencart 1.5.2,在导入大量产品后,我的速度大大降低。我试着安装了一个必须加快网站速度的。。。没有


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

查看
目录/controller/module/categories.php
。默认情况下,“类别”模块在菜单中每个项目旁边显示产品计数。在我看来,这会导致相当大的查询开销,从而获得非常小的用户体验收益

线路

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

出现两次,如果您将其注释掉(并且在下面使用了
$product\u total
),您应该会看到非常显著的收益。

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

如果编辑
目录
模块,可以通过将
产品计数:
设置为
禁用
来禁用导航菜单的产品计数(默认显示在左栏)

默认主题在站点的主菜单中还显示产品数量。您可以在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\u 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\u catalog\u product->getTotalProducts()
的引用

如果搜索对
getTotalProducts()
的其他引用,请确保不删除使用产品计数进行分页的引用,否则分页将无法正常工作。下面是一个来自catalog/controller/product/search.php的示例,该文件需要产品计数才能正常工作

$pagination->total = $product_total;

删除这些引用使我的开发服务器上的页面加载时间在使用~2000种产品的opencart安装中提高了近10倍。

解决了这个问题。OC团队发现的SQL查询中似乎有一种“新”的方法,应该称之为“DDoS自生自灭”

产品库现在已经增长到129个类别的37k个产品(从晚上的18k,lol…不应该编写自动导入脚本并将其交给lamer…),加载时间从6-12秒增长到20-25秒,严重影响了SQL server:

[报价]Саааааааааааааааааа1072 ччааааааc:1301788(小时平均值) øцццццццццц:21696(每分钟平均成绩) øбббббббббб:362(秒平均值) [quote]

这是不正常的,因为系统上有2个用户-自动脚本(限制-每秒30个问题,然后睡眠(1))和me(362-30=每秒332个查询?由人类?WTF开发人员?)。基于此统计数据,以这种方式运行的OC将需要一个严肃的服务器场来同时服务500多个用户。不会发生的。今生没有

我确实维护了各种网站,并且几乎重写了所有的网站。我访问量最大的站点(每天访问20万次)每天“仅”生成2.5 mil ques。相信我,它有很重的(内容)。如果OC平均加载(200k视图),这意味着每天将有1-1.2亿个QUE

另外,查询也不是很明智,因为ORDER BY(正如我所怀疑的)和SELECT DISTINCT(痛苦!!!)给服务器带来了困难

此外,每个查询都设置了许多选项,无论它们是否由用户设置(排序、顺序等)。即使用户不需要任何排序顺序(ASC、DESC等),这也会使查询比预期的长4-5倍

还有一些问题写得很糟糕,这让我很开心。只要你能做简单的一行“选择计数(*)FROM…”,你怎么能通过5个PHP和3个查询来提取任何东西的总数呢?OC团队似乎并不关心执行时间和服务器负载

如果有人对我所写的内容感到不快,我想表示歉意,但就我而言,我是对的:实现目标的整个方法都是错误的(37k产品/129只猫的快速执行)。OC可能适合拥有2个类别和50种产品的人(lol?)。不知道我可能不会发现

作为一个信息缓存不是一个解决方案。服务器端缓存已经足够好了。任何超出此范围的内容都意味着您有严重的编码问题。所以不要。。。我重复一遍,不要购买缓存模块。他们在隐藏问题,而不是解决问题。如果缓存模块可以在40k产品上隐藏问题,那么在140k产品上就无法做到这一点。对于缓存模块lol,您需要缓存模块

现在,我们来看看解决方案。简单的方法。我们将只修改主要问题。我不会解释我在我的版本上所做的que修改,因为它们存在于许多文件中,如果你不明白你在做什么,它们是至关重要的(你可能会失去你想要保留的OC选项,而我不关心选项,只要网站加载半分钟)。所以-只需稍作修改

Wil say-解释版本1.5.5.1股票,股票主题。方法-无mods。修改后,您将松开左侧的分类块,但您的站点将加载得非常快(37k产品/129猫->平均0.137秒,总计5次加载,服务器距离约为200mi)

0)备份您的站点。我们将修改文件。你可能会搞得一团糟。然后哭

1) Get/catalog/controller/product/category.php 查找行:184

必须包含:
$product\u total=$this->model\u catalog\u product->getTotalProducts($data)

替换为:
/$product\u total=$this->model\u catalog\u product->getTotalProducts($data)

`## 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 ##`
<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>
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'];
}