Тормозит Opencart часть 1 (подсчет количества товаров)

Тормозит Opencart часть 1 (подсчет количества товаров)

Несмотря на простоту и гибкость Opencart, в нем присутствуют определенные структурные и архитектурные недоработки, приводящие к тому что, магазин после добавления 500-700 товаров, и 30-40 категорий магазин начинает заметно подтормаживать, особенно это ощущается на дешевых Shared-hosting пакетах. Чем это обусловлено до конца не понятно, то ли изначально никто не предполагал что магазины на опенкарте будут содержать больше сотни товаров, то ли разработчики, начиная писать движок, не до конца понимали с чем они столкнуться.

И если у вас время генерации страницы, например со списком товаров в категории занимает до секунды, то на это можно закрыть глаза, и не париться. Но если же посетитель каждый раз ждет загрузки страницы секунд по 10, то тут стоит задуматься.

В такой ситуации при обращению к хостеру с вопросом «что делать ?», вас тут же начнут переманивать на более дорогой пакет, или  на переезд на VPS. Если вы планируете всерьез и долго торговать онлайн, на VPS вам перехать придется так или иначе, но на раннем этапе можно попробовать обойтись и без этого. Хотя при большом количестве товаров (от 5000) и категорий (от 100) на VPS переезжать все таки придется.

Итак, для того чтобы ваш магазин несколько живее начал шевелиться есть попробуем описать несколько базовых методов, применив которые, мы сможем существенно уменьшить время генерации страницы и снизить нагрузку на сервер.

Методы оптимизации условно можно разделить на два типа. Первый — оптимизация динамического контента (по сути весь HTML, который формирует движок и есть динамический контент). И оптимизация статического контента. Статический контент — это изображения, файлы стилей CSS и Java-скрипты. Так как вашему WEB-серверу довольно просто отдавать статику практически в любых количествах (если не брать клинические случаи, с поделками всяких гениев от вебдизайна, которые умудряются вставить фоновую картинку мегабайт на 10), первое чем стоит заняться оптимизацией движка и скоростью генерации HTML контента. Тонкая оптимизация отдачи статического контента тоже имеет место быть и нужна, но она не первостепенна, и требует продвинутых навыков администрирования веб-сервера, либо привлечения сторонних специалистов, так что к ней мы вернемся позже. И основной упор попытаемся сделать на разборе вопросов связанных с программной и структурной оптимизацией движка и базы данных вашего магазина.

Самый большой тормоз, зарыт казалось бы в такой несущественной детали как подсчет товаров в категории. Непонятно, почему это было сделано в движке через пень-колоду но это факт.

Для того чтобы избавиться от этой проблемы. Идем в настройки магазина. И во вкладке подсчет количества товаров, ставим значение — выключить!

Тем самым каждый раз когда у вас будет генериться верхнее меню, движок вашего магазина будет делать на порядок меньше запросов. А ваши посетители переживут, тот факт что, они не видят сколько товаров в категории. Если у вас старая версия движка, в которой еще не было возможности отключать подсчет количества товаров, открываем файл «catalog/controller/common/header.php»

ищем в районе 200 строки строку вот с таким кодом:

И просто закометируем ее вот так:

После этого меняем строку

на

И с подсчетом товаров в верхнем меню мы разделались, уже жить стало легче.

Но это еще не все. В движке «из коробки» идет чудный модуль под названием категории. И «о чудо» в нем тоже есть подсчет количества товаров. И мы получаем еще раз те же тормоза что и при генерации верхнего меню.

Заходим в раздел модули и потом в настройку модуля «Категории». Если там есть выключение подсчета количества товаров, выключаем, и радуемся, если нету, находим файл «catalog/controllre/module/category.php»

И производим с ним те же манипуляции что и с предыдущим файлом header.php.

В итоге первый шаг в сторону ускорения сделан. Но это только самое самое начало. В следующем постах мы вам расскажем, где еще скрыты подводные камни, и как от них избавиться.

 

Хуйнаныр(14)Очко(2)

Запостить высер

Стучать мне на мыло
avatar

Сортировать:   Свежие | Тухлые | Хуйнанырные
Олег
робот-вертер
3 лет 7 месяцев назад

Благодарю автора за данные статьи, все подробно и понятно написано! Занимаетесь полезным делом, тем более что для opencart нет толком документации на русском.
Выключил у себя подсчет товаров, действительно работает быстрее. Еще хочу поделиться, что в версии 1.5.5.1.1 уже предусмотрена опция отключения подсчета товаров в категориях прямо из админки, и даже снабжена предупреждением, что включение подсчета сильно нагрузит ваш сервер. В версии 1.5.1.3 такой возможности в админке нет. В связи с этим, может кто сможет написать модуль для управления функцией включения\выключения из админки?

Black Overlord
Magistr 80 level
3 лет 7 месяцев назад

1.5.1.3 — совсем дрова по сегодняшним меркам, и псиать под него такие моды смысла нет, проще вручную в коде закомментировать пару строк.

попробуйте вот этот кешер для верхнего меню и модуля категорий — возможно заработает на OcStore, пока что есть версия толко для OpenCart

Олег
робот-вертер
3 лет 7 месяцев назад

А как потом можно измерить разницу во времени генерации страниц до и после?

Black Overlord
Magistr 80 level
3 лет 7 месяцев назад
Сергей
робот-вертер
Сергей
3 лет 7 месяцев назад

К стати , а как действует на скорость, подсчет товаров в подкатегориях,т.е на странице категории под описанием, и как его убрать ?

Black Overlord
Magistr 80 level
3 лет 7 месяцев назад

Действует точно так же тормозяще, но менее губительно, убрать по тому же принципу как и из Header, но нужно найти соответсвующие строки в контроллере категорий.

Сергей
робот-вертер
Сергей
3 лет 7 месяцев назад

В категории не получается , там немного другой код и вылазят ошибки если убирать «(‘ . $product_total . ‘)» ипропадают кнопки перехода на след. страницу
т.е данный тег связан со страницами пагинации

Black Overlord
Magistr 80 level
3 лет 7 месяцев назад

Вы закомментировали общий подсчет количества для категории, он нужен для формирования пагинации, нужно только для подкатегорий.

foreach ($results as $result) {
$data = array(
‘filter_category_id’ => $result[‘category_id’],
‘filter_sub_category’ => true
);

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

$this->data[‘categories’][] = array(
‘name’ => $result[‘name’] . ‘ (‘ . $product_total . ‘)’,
‘href’ => $this->url->link(‘product/category’, ‘path=’ . $this->request->get[‘path’] . ‘_’ . $result[‘category_id’] . $url),

‘title’ => $result[‘seo_h1′],
);
}

Вот здесь и все!

Сергей
робот-вертер
Сергей
3 лет 7 месяцев назад

Все сделал, спасибо !, только исправте сдесь в статье с верху страницы ‘name’ => $child[‘name’] на ‘name’ => $result[‘name’]

Павел
робот-вертер
Павел
3 лет 6 месяцев назад

Это замечательный подробный мануал, который помог мне увеличить скорость загрузки страниц интернет-магазина более чем в два раза. Конечно, о том, что нужно убрать подсчёт товаров я догадывался, но подробную инструкцию, которая помогла мне это сделать нашёл именно здесь. Большое спасибо!

trackback

[…] часть 1 часть 2 часть 3 часть 4 часть 5 […]

trackback

[…] статьи из цикла тормозит Opencart: 1 часть 2 […]

Михаил
робот-вертер
Михаил
3 лет 4 месяцев назад

Прикол в том что если опцию убрать — то подсчет все равно ведется
она нужна для того чтобы просто выводить или нет
т.е. сначала ведется вычисление а потом уже собственно разборка — а есть ли опция по вычислению…
===
/* !!! */ $product_total = $this->model_catalog_product->getTotalProducts($data);
$this->data[‘categories’][] = array(
‘name’ => $result[‘name’] . ($this->config->get(‘config_product_count’) ? ‘ (‘ . $product_total . ‘)’ : »),
‘href’ => $this->url->link(‘product/category’, ‘path=’ . $this->request->get[‘path’] . ‘_’ . $result[‘category_id’] . $url)
);
===

Black Overlord
Magistr 80 level
3 лет 4 месяцев назад

Прикол, как вы говорите в том, что подсчет происходит методом getProducttotal — и я же написал, что его нужно комментировать. Если вы это делаете, то не осуществляется запросы в базу для подсчета товаров.

noVe
робот-вертер
noVe
3 лет 2 месяцев назад

Опечатка:

И производим с ним те же манипуляции что и с предыдущим файлом footer.php.

header?

Black Overlord
Magistr 80 level
3 лет 2 месяцев назад

Да. Попрвалено

SnowAnimal
робот-вертер
SnowAnimal
3 лет 1 день назад

Подскажите что надо закоментировать здесь в category.php
foreach ($children as $child) {
$data = array(
‘filter_category_id’ => $child[‘category_id’],
‘filter_sub_category’ => true
);

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

$total += $product_total;

$children_data[] = array(
‘category_id’ => $child[‘category_id’],
‘name’ => $child[‘name’] . ($this->config->get(‘config_product_count’) ? ‘ (‘ . $product_total . ‘)’ : »),
‘href’ => $this->url->link(‘product/category’, ‘path=’ . $category[‘category_id’] . ‘_’ . $child[‘category_id’])
);
}

Aleks
робот-вертер
2 лет 9 месяцев назад

И оптимизация статического контента. Статический контент — это изображения, файлы стилей CSS и Java-скрипты.

Хотелось про данную оптимизацию тоже почитать. Очень актуально!!!

Джо
робот-вертер
Джо
2 лет 7 месяцев назад

Спасибо автору, сайт начал летать, загрузка категории ускорилась.

Serega
робот-вертер
Serega
2 лет 2 месяцев назад

Здравствуйте, подскажите пж стоит opencart 1.5.6.4

‘name’ => $child[‘name’] . ‘ (‘ . $product_total . ‘)’ — нету

Владимир
робот-вертер
Владимир
2 лет 22 дней назад

Подскажите пожалуйста, отчего может начать тормозить сам магазин и админка в том числе? Вроде после всех нововведений было нормально, делаю бэкап прошлых сохранений — не помагает. Тормозит загрузка сайта и вся админка. Проблемы с хостингом?

Black Overlord
Magistr 80 level
2 лет 22 дней назад

Пишите в скайп ocshop.support

Руслан
робот-вертер
Руслан
1 год 4 месяцев назад

Предлагаю все же не резать функционал опен карта, а скорее доработать этот косяк
вместо комментирования вставьте эту строчку.
Эту строку:
$product_total = $this->model_catalog_product->getTotalProducts($data);
Меняем на эту:
$product_total = $this->config->get('config_product_count') ? $this->model_catalog_product->getTotalProducts($data) : 0;

Yoda
Magistr 80 level
1 год 4 месяцев назад

Это неправильное решение — если говорить о том чтобы не резать — решается по другому. Но смысла в подсчете в большинстве случаев нету!

wpDiscuz