2012-03-28 5 views
5

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

Store

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

+0

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

ответ

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

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

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

[quote] Вопросов начиная с запуска: 514,064,911 (вопрос с момента запуска) ø в час: 1,301,788 (ques avg за час) ø в минуту: 21,696 (Ques сред для мин) ø в секунду: 362 (Ques сред для второй) [/ quote]

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

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

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

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

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

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

В качестве INFO - кэширование - это не решение. Кэширование на стороне сервера достаточно. Что-то кроме этого означает, что у вас серьезные проблемы с кодированием. Так что не ... Я буду повторять НЕ ПОКУПАЙТЕ модули кеширования. Они скрывают проблемы, а не решают их. Если модуль кэширования может скрыть проблему на 40k-продуктах, он не сможет сделать это в продуктах 140k. Вам понадобится модуль кэширования для модуля кэширования, lol.

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

Wil say - пояснил для версии 1.5.5.1. Средства - нет модов. После модификации вы потеряете левый блок с категориями, но ваш сайт загрузит ДЕЙСТВИТЕЛЬНО FAST (37 тыс. Продуктов/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 запросов WTF.? ?)

2) Получить /catalog/controller/product/category.php Find линии: 187

должна содержать: 'name' => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),

Заменить: 'name' => $result['name'],

Описание: Очистка - нет счетчика, чтобы показать в категориях, так как мы не `сосчитать их больше.

3) Получить /catalog/controller/product/category.php Find линии: 388 должна содержать: 'common/column_left',

Заменить: // 'common/column_left',

Описание: поколение Skippng из левой колонки в категории Посмотреть.

4) Получить /catalog/controller/product/product.php Find линии: 463 должна содержать: 'common/column_left',

Заменить: // 'common/column_left',

Описание: поколение Skippng в левой колонке с точки зрения продукта ,

5) Получить /store/catalog/view/theme/default/template/product/product.tpl Find линии: 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 Find линии: 1

должен содержать: <?php echo $header; ?><?php echo $column_left; ?><?php echo $column_right; ?>

Заменить: <?php echo $header; ?><?php echo $column_right; ?>

Описание: Удаление левой колонки из темы - просмотр каталога.

СОВЕРШЕННО. Проверьте скорость загрузки. Должно быть довольно удивительно, если ваша проблема была похожа на мою.

ПРИМЕЧАНИЕ. Обратите внимание, что я не знаком с версией OC и не использовал ее раньше. Поскольку мы решили часть проблемы, она не полностью решена. Это временное решение. Удаление деталей, которые вызывают медленную нагрузку, является решением, пока вы не напишете их снова, на этот раз, надеюсь, лучше. Я готов переписать его, если кто-то хочет превзойти моего начальника. Я могу взять отпуск и работать для вас:) Моя оплата в настоящее время 4700 € в неделю.Понимание и переписывание этого левого столбца правильным образом не должно занимать более 1-2 рабочих дней.

PP. Будет опубликован это в нескольких местах, потому что я не думаю, что команда разработчиков OC понравится, что они прочитали, независимо от того, что я не собираюсь их обижать - просто указать на критические ошибки, которые они совершили (время загрузки 25.31 avg для каждой страницы в тестах - ни один клиент не будет ждать более 3-4 секунд, прежде чем отправиться на другой сайт! Dafuq?). И, не позволяя мне публиковать эту информацию, люди не знают, как выйти из проблемы, и пойти на покупку «модуля кэширования», который фактически держит файлы на жестком диске, как дикие. Отходы денег, отходы ресурсов жесткого диска, отходы электричества ... и все это - для создания иллюзии все работает нормально, а это не так.

+0

Многим основным изменениям – TheBlackBenzKid

+0

Этот метод помогает. Спасибо! –

+1

Получил это разобрал. Кажется, что в SQL-запросах, открытых командой OC, есть «новый» подход, и его следует называть «DDoS самостоятельно до смерти». +1 – Jordy

0

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

Ссылка: Full Page Cache

0

Я нашел другое решение этой проблемы. В основном, 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

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

10

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

У меня есть oc v1.5.5.1 с примерно 3K категориями и 40K продуктами. Я запускаю его на общем хостинге, и сначала мое время загрузки составляло около 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 секунд на страницу.

Теперь моя ос работает примерно 1 секунду на страницу, я добился того, что, добавив еще несколько индексов в моей тузда таблице, по сообщению этого парня 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, но он не поддерживает сео URLs, как это, так что мне пришлось настроить его немного (путем декодирования $_REQUEST['_route_'] параметра, который содержит запрос сео URL-адрес, в функции run).

+0

Здравствуйте. Не могли бы вы поделиться этим решением для seo url fpc? – geryjuhasz

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 (я уверен, относится Ot версию тоже) проблема была в следующем:

Еогеасп ($ категории как $ категории) в каталоге/контроллер/модуль/category.php вокруг линии 33

Еогеасп ($ категории в $ категории в каталоге/контроллер/общий/заголовок .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: Issue With Slow Opencart When Having Lots of Categories

0

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

каталог/модель/каталог/product.php -> публичная функция getTotalProducts ($ data = array()) { ...

Поместите это в начале функции:

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

Put это в конце

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

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

Надеюсь, что это поможет.

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^