Opencart чрезвычайно медленная скорость загрузки - PullRequest
5 голосов
/ 29 марта 2012

Я использую Opencart 1.5.2 на своем сервере, и после импорта большого количества продуктов я значительно снизил скорость. Я попытался установить vq mod , который должен был ускорить сайт ... это не удалось.

Магазин

Я знаю, что на сайте есть несколько элементов, которые относительно велики, но до импорта он работал нормально.

Ответы [ 10 ]

11 голосов
/ 05 сентября 2013

Если в вашей открытой тележке включено seo urls, это может быть существенным источником медлительности.

У меня есть oc v1.5.5.1 с примерно 3К категориями и 40К продуктами.Я запускаю его на виртуальном хостинге, и сначала мои времена загрузки составляли около 40 секунд и выше.Затем я немного углубился в opencart и понял, что он делает огромное количество запросов к таблице oc_url_alias в базе данных oc.Итак, мой совет:

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

Также,как уже упоминалось в других ответах, я также убрал количество товаров в: catalog/controller/product/category.php и catalog/controller/module/categories.php.Если вы все еще испытываете медлительность, вы можете полностью отключить модуль категорий на боковой панели.

Наконец, вы можете попробовать использовать это расширение: http://www.opencart.com/index.php?route=extension/extension/info&extension_id=10464,, но оно не поддерживает URL-адреса seo как есть, поэтому мне пришлосьнемного подправить (расшифровав параметр $_REQUEST['_route_'], который содержит seo url-запрос, в функции run).

11 голосов
/ 26 мая 2012

Количество продуктов в категориях является значительным источником медленной загрузки страниц в 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() Убедитесь, что вы не удаляете ссылки, которые используют счетчик продуктов для нумерации страниц, иначе нумерация страниц не будет работать должным образом. Вот пример из catalog / controller / product / search.php , файла, которому для правильного функционирования требуется счетчик продуктов.

$pagination->total = $product_total;

Удаление этих ссылок привело к почти 10-кратному ускорению загрузки страниц на моих серверах разработки при установке opencart с ~ 2000 продуктами.

9 голосов
/ 16 марта 2013

Понял. Кажется, что в SQL-запросах обнаружен «новый» подход, открытый командой OC, и его следует называть «DDoSself to death».

База продуктов теперь выросла до 37 тыс. Продуктов в 129 категориях (с 18 тыс. За ночь, лол ... не стоило писать сценарии автоматического импорта и передавать их ламеру ...), а время загрузки выросло с 6 От -12 секунд до 20-25 секунд, сильно ударяя по SQL-серверу:

[цитата] Вопрос начинается с запуска: 514 064 911 (задание с момента запуска) ø в час: 1,301,788 (средняя просьба за час) ø в минуту: 21 696 (средняя просьба за минуту) ø в секунду: 362 (задание для второго) [/ Цитата]

Это НЕ нормально, так как в системе 2 пользователя - автоматизированный скрипт (ограниченный - 30 запросов в секунду, затем sleep (1)) и я (362-30 = 332 запроса в секунду - человеком? WTF разработчики?). Исходя из этой статистики, OC, таким образом, потребуется серьезная серверная ферма для обслуживания более 500 пользователей одновременно. Не случится. Не в этой жизни.

Я поддерживаю различные веб-сайты и переписал почти все из них. Мой самый посещаемый сайт (200 тыс. Посещений в день) генерирует «только» 2.5Mil квестов в день. И это имеет тяжелый (содержание), поверьте мне. Если бы OC был загружен одинаково (200k просмотров), это означало бы, что в день будет 100-120Mil квестов.

ТАКЖЕ запросы не такие мудрые, что затрудняет работу сервера с ORDER BY (как я и подозревал) и SELECT DISTINCT (боль !!!).

ТАКЖЕ существует множество опций для каждого запроса, независимо от того, установлены они пользователем или нет (сортировка, заказ и т. Д.). Это делает квесты в 4-5 раз длиннее, чем ожидалось, даже если пользователь не хочет сортировать (ASC, DESC и т. Д.)

ТАКЖЕ есть квесты, написанные так плохо, что меня забавляет. Как вы можете получить общее число для что-нибудь , используя 5 phps и 3 запроса, если вы можете сделать простую 1 строку «SELECT COUNT (*) FROM ...»? Команда OC, похоже, не заботится о времени выполнения и нагрузке на сервер.

Я хотел бы извиниться, если кто-то обиделся на то, что я написал, но в моем случае я прав: весь подход неверен для достижения целей (быстрое выполнение на 37 тыс. Товаров / 129 кошек). OC мог бы быть хорошим для кого-то с 2 категориями и 50 продуктами (смеется?). Не знаю. И я, вероятно, не узнаю.

Как информация - кэширование не является решением. Кэширование на стороне сервера достаточно. Все, что за этим стоит, означает, что у вас есть серьезные проблемы с кодированием. Так что не ... я повторю, НЕ КУПИТЬ модули кеширования. Они прячут проблемы, а не решают их. Если модуль кэширования может скрыть проблему на продуктах 40 КБ, он не сможет сделать это на продуктах 140 КБ. Вам понадобится модуль кеширования для модуля кеширования, lol.

Теперь к решению. Простой способ. Мы будем модифицировать только основные проблемы. Я не буду объяснять изменения очередей, которые я сделал в моей версии, потому что они находятся во многих файлах и имеют решающее значение, если вы не понимаете, что делаете (вы можете потерять опции OC, которые хотели бы сохранить, хотя мне все равно про варианты пока сайт загружается за полминуты). Итак - ТОЛЬКО незначительные модификации.

Скажем - объяснил для версии 1.5.5.1 сток, стоковая тема. Значит - без модов. После модификации вы потеряете левый боковой блок с категориями, но ваш сайт будет загружен действительно быстро (37 000 товаров / 129 кошек -> 0,137 секунд в сумме при 5 нагрузках, расстояние до сервера ~ 200 миль)

0) BACKUP вашего сайта. Мы будем изменять файлы. Вы могли бы сделать ужасный беспорядок. И плачь потом.

1) Получить /catalog/controller/product/category.php Найти строку: 184

Должен содержать: $product_total = $this->model_catalog_product->getTotalProducts($data);

Заменить на: //$product_total = $this->model_catalog_product->getTotalProducts($data);

Описание: Комментирование категорий учитывается, поскольку для подсчета товаров в 129 категориях требуется немало времени (129 запросов? WTF?)

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 секунд, прежде чем перейти на другой сайт! Дафук?). И, не позволяя мне публиковать эту информацию, люди не знают, как найти выход из проблемы и купить "модуль кеширования", который фактически копирует файлы на жестком диске как дикий. Трата денег, растрата ресурсов жесткого диска, растрата электричества ... и все это - для создания иллюзии все работает нормально, в то время как это не так.

1 голос
/ 06 июня 2014

В магазине, над которым я работаю, это версия 1.5.6.4_rc (я уверен, что она применима и к вашей версии), проблема заключалась в следующем:

foreach ($ category как $ category) в каталоге/controller/module/category.php около строки 33

foreach ($ category как $ category в каталоге / controller / common / header.php около строки 107

Из-за этого кода у нас было более900 дБ запрашивают многие из $ this-> url-> 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: Проблема с медленной Opencart при большом количестве категорий

1 голос
/ 28 мая 2014

Посмотрите на файл .htaccess, как описано в этого урока :

`## 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 ##`
0 голосов
/ 04 июня 2015

Вы должны создать 02 индекса для ключевых слов и столбцов запросов в таблице OC_URL_ALIAS. Вы будете впечатлены скоростью. Я использовал PageSpeed ​​Insight от Google для измерения скорости моего сайта. В первый раз результат «В нашем тесте ваш сервер ответил за 12,2 секунды». После создания двух индексов время отклика составляет 7,8 секунды:)

0 голосов
/ 01 сентября 2014

Вот что исправило это для меня. Как упоминалось в предыдущих плакатах, основная причина замедления заключается в:

catalog / model / catalog / product.php -> открытая функция 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 голосов
/ 05 августа 2013

Я нашел другое решение проблемы. По сути, MySQL задыхается, когда пытается одновременно фильтровать результаты запросов из таблиц Product_category и Product_Tag. Я написал vqMod для OC 1.5.2.1, который заменяет функцию getTotalProducts () и создает отдельные запросы SQL, которые должны быть выполнены для двух таблиц. Затем он использует SQL UNION, чтобы связать результаты обоих запросов вместе. Это решение повышает производительность и позволяет вам продолжать использовать счетчики продуктов на вашем сайте.

Это заняло у меня время загрузки страницы с 45 до 50 секунд до менее чем 1 секунды !!!

Я только что разместил файл vqMod здесь: http://www.opencart.com/index.php?route=extension/extension/info&token=7bc7d0149c7101c3d336b2e0b29e3f03&extension_id=13155

Дайте мне знать, если у вас есть какие-либо вопросы, и я помогу, где смогу.

0 голосов
/ 01 августа 2013

Может быть, вам нужен Full Page Cache, иначе FPC создан для ускорения вашего магазина, создавая простой файл для загрузки вместо всей платформы opencart. Это расширение будет кэшировать все страницы вашего каталога, но будет поддерживать динамическую информацию о пользователе.

Ссылка: Кэш полной страницы

0 голосов
/ 23 мая 2012

Взгляните на catalog/controller/module/categories.php. По умолчанию модуль категории отображает количество продуктов рядом с каждым элементом в меню. Это приводит к значительным расходам на запрос для очень небольшого усиления (на мой взгляд).

Линия

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

появляется дважды, если вы закомментируете это (и где $product_total используется под ним), вы должны увидеть довольно значительный выигрыш.

...