Перейти к содержанию
jurevog

Очень медленно открывается магазин

Рекомендуемые сообщения

Здравствуйте.

 

Взял хостинг, установил на него магазин (15511 оцсторе), настроил - все нормально. Как только загрузил базу товаров (15000 позиций), любая страница магазина открывается 5 секунд, причем вот так:

- первые 3 секунды висит сообщение "Ожидание site.ru"

- потом буквально за 1-2 секунды загружается сайт (ограничение только моим каналом)

 

Другие сайты в первой фазе ожидания 0,5 - 1 секунду, потом идет загрузка в зависимости от веса сайта.

Сменил хостинг - время первой фазы даже ухудшилось, ожидание 3-4 секунды.

 

Техподдержка второго хостинга предлагает провести платную недешевую диагностику: "проблема характерна для неправильных прав на некоторые файлы, для не оптимизированной базы данных, и ещё по некоторым причинам"

 

Есть ли решения для этой ситуации?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Отключите подсчет количества товаров

2. КЕШ КЕШ КЕШ!

3. Индексы базы.

4. Сео про с кешированием, проверьте стоит или нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

или элементарно посмотрите вес фото на заднем фоне 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Отключите подсчет количества товаров

2. КЕШ КЕШ КЕШ!

3. Индексы базы.

4. Сео про с кешированием, проверьте стоит или нет.

1. Отключено.

2. ЧТО ЧТО ЧТО КЭШ? Нет, правда, о каком кэше речь? Папку cache очищал. Очищал кэш картинок. Что еще должен сделать?

3. Могли бы подробнее сказать, что здесь сделать?

4. Обычный сеопро из сборки с этого сайта (оцсторе 1.5.5.1.1) - где в нем проверять?

 

или элементарно посмотрите вес фото на заднем фоне 

Не, тут все хорошо.

 

Вот например такие данные получил сейчас:

2014-02-17 18:40:26 - 3.06616 |    84 | /index.php?route=product/product&path=345_438&product_id=38631
2014-02-17 18:40:26 - --------------------
2014-02-17 18:40:26 - 0.00700 |     6 | /index.php?route=product/product/captcha
2014-02-17 18:40:26 - --------------------
2014-02-17 18:40:26 - 0.00962 |     8 | /index.php?route=product/product/review&product_id=38631
2014-02-17 18:40:26 - --------------------
2014-02-17 18:40:29 - ----------
2014-02-17 18:40:29 - 0.10264 |    21 | /home/user/www/site.ru/catalog/controller/module/category.php(45)
2014-02-17 18:40:29 - 0.28778 |     2 | /home/user/www/site.ru/catalog/controller/module/latest.php(32)
2014-02-17 18:40:29 - 2.21551 |    17 | /home/user/www/site.ru/catalog/controller/common/header.php(124)
2014-02-17 18:40:29 - ----------
2014-02-17 18:40:29 - 2.67347 |    78 | /
2014-02-17 18:40:31 - --------------------
2014-02-17 18:40:37 - ----------
2014-02-17 18:40:37 - 0.27066 |     2 | /home/user/www/site.ru/catalog/controller/product/category.php(213)
2014-02-17 18:40:37 - 2.25971 |    15 | /home/user/www/site.ru/catalog/controller/product/category.php(190)
2014-02-17 18:40:37 - 2.54628 |    17 | /home/user/www/site.ru/catalog/controller/common/header.php(124)
2014-02-17 18:40:37 - ----------
2014-02-17 18:40:37 - 5.40470 |   115 | /index.php?route=product/category&path=375

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По мотивам одной статьи удалил подсчет категорий вручную на всякий случай из catalog/controller/common/header.php и catalog/controllre/module/category.php

И сделал в SQL индексы:

 

 

ALTER TABLE oc_product_attribute ADD INDEX attribute_id ( attribute_id );
ALTER TABLE oc_product_attribute ADD INDEX language_id ( language_id );
 
ALTER TABLE oc_product_description ADD INDEX language_id ( language_id );
 
ALTER TABLE oc_product_image ADD INDEX product_id ( product_id );
ALTER TABLE oc_product_image ADD INDEX sort_order ( sort_order );
 
ALTER TABLE oc_product_option ADD INDEX product_id (product_id);
ALTER TABLE oc_product_option ADD INDEX option_id (option_id);
 
ALTER TABLE oc_product_option_value ADD INDEX product_option_id (product_option_id);
ALTER TABLE oc_product_option_value ADD INDEX product_id (product_id);
ALTER TABLE oc_product_option_value ADD INDEX option_id (option_id);
ALTER TABLE oc_product_option_value ADD INDEX option_value_id (option_value_id);
ALTER TABLE oc_product_option_value ADD INDEX subtract (subtract);
ALTER TABLE oc_product_option_value ADD INDEX quantity (quantity);
 
ALTER TABLE oc_product_reward ADD INDEX product_id ( product_id );
ALTER TABLE oc_product_reward ADD INDEX customer_group_id ( customer_group_id );
 
ALTER TABLE oc_product_to_category ADD INDEX category_id ( category_id );
 
ALTER TABLE oc_product_to_store ADD INDEX store_id ( store_id );
 
ALTER TABLE oc_setting ADD INDEX store_id ( store_id );
ALTER TABLE oc_setting ADD INDEX `group` ( `group` );
ALTER TABLE oc_setting ADD INDEX `key` ( `key` );
ALTER TABLE oc_setting ADD INDEX serialized ( serialized );
 
ALTER TABLE oc_url_alias ADD INDEX query ( query );

 

Стало вроде чуть быстрее, но не намного:

 

2014-02-17 19:18:24 - 0.26521 |     1 | /home/user/www/site.ru/catalog/controller/product/category.php(211)

2014-02-17 19:18:24 - 0.38979 |     2 | /home/user/www/site.ru/catalog/controller/product/category.php(213)
2014-02-17 19:18:24 - 3.02801 |    15 | /home/user/www/site.ru/catalog/controller/product/category.php(190)
2014-02-17 19:18:24 - ----------
2014-02-17 19:18:24 - 3.99588 |    98 | /index.php?route=product/category&path=375

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Удалил отовсюду подсчет товаров в категории, оставив только где надо для пагинации. Удалил кэши с помощью модуля csv import/export, почистил папку cache:

2014-02-17 21:25:26 - --------------------
2014-02-17 21:25:26 - 0.44476 |    56 | /index.php?route=common/home
2014-02-17 21:25:30 - --------------------
2014-02-17 21:25:30 - 0.60356 |    88 | /index.php?route=product/category&path=375
2014-02-17 21:25:35 - --------------------
2014-02-17 21:25:36 - 0.48379 |    88 | /index.php?route=product/category&path=339
2014-02-17 21:25:42 - --------------------
2014-02-17 21:25:42 - 0.61959 |    88 | /index.php?route=product/category&path=345
2014-02-17 21:25:54 - --------------------
2014-02-17 21:25:54 - 0.25074 |    61 | /index.php?route=product/product&path=345&product_id=39857
2014-02-17 21:25:55 - --------------------
2014-02-17 21:25:55 - 0.01083 |     6 | /index.php?route=product/product/captcha
2014-02-17 21:25:55 - --------------------
2014-02-17 21:25:55 - 0.00871 |     8 | /index.php?route=product/product/review&product_id=39857
2014-02-17 21:25:57 - --------------------
2014-02-17 21:25:58 - 0.51304 |    56 | /
2014-02-17 21:26:00 - --------------------
2014-02-17 21:26:00 - 0.05612 |    26 | /index.php?route=information/contact
2014-02-17 21:26:01 - --------------------
2014-02-17 21:26:01 - 0.01362 |     6 | /index.php?route=information/contact/captcha
2014-02-17 21:26:03 - --------------------
2014-02-17 21:26:03 - 0.55184 |   131 | /index.php?route=information/sitemap

Категория 375 содержит 2000 позиций. Вроде значительно улучшилось, но все равно не эталон

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

было

2014-02-17 18:40:37 - 5.40470 | 115 | /index.php?route=product/category&path=375
затем
2014-02-17 19:18:24 - 3.99588 |    98 | /index.php?route=product/category&path=375

стало

2014-02-17 21:25:30 - 0.60356 | 88 | /index.php?route=product/category&path=375

 

благодаря модулю вы сами, без затрат сумели увеличить скорость в ~6 раз. думаю не плохой результат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть, получается все дело было в подсчете товаров в категории?! Но ведь эта опция уже отключена в настройках.

 

И я не уверен, что те команды кэширования, что я ввел в SQL, как-то повлияли на скорость. Как думаете, они помогли? Хуже от них не могло стать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогли индексы, однозначно,

кеш делать на выборки данных, так же как это частично по коду разбросано.

 

Вот есть у вас меню например. вы получаете список категорий...

 

$categories = $this->catalog_model bla bla bla

 

 

Везде по случаю надо добавить

$categories = $this->cache->get('menu');
if(!$categories) {
//Получаем данные
$categories = $this->catalog_model bla bla bla...

//Сохраняем в кеш
$categories = $this->cache->set('menu',$categories );
}

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

 

И почитайте вот это:

https://opencartforum.com/topic/3355-est-li-modul-analiza-log-failov/?do=findComment&comment=22909#entry22909

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, что вмешиваюсь, но

1. База OpenCart проиндексирована и так уже хорошо, а запросы используются такие, что индексы не действуют. Проверьте EXPLAIN'ом. Единственно, где не хватает индекса - url_alias

 

2. Причины многих тормозов - действительно подсчет количества товаров в категории. А также рекурсивный способ построения дерева категорий. Yesvik абсолтно прав.

 

3. Кэшировать отдельные SQL-запросы пожалуй не надо. Хорошо помогает - кэшировать весь вывод контроллера категорий, разумеется с учетом текущего языка и $this->request->get['path']

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Очень часто встречаются случаи, когда всякого рода парсеры дропают таблицы и создают заново без индексов, лишний раз проверить индексы не помешает.

 

2. Согласен.

 

3. Речь шла о кешировании средствами самой MySql, некоторые настройки все таки чуть оживляют процесс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Очень часто встречаются случаи, когда всякого рода парсеры дропают таблицы и создают заново без индексов, лишний раз проверить индексы не помешает.

 

2. Согласен.

 

3. Речь шла о кешировании средствами самой MySql, некоторые настройки все таки чуть оживляют процесс.

1. Не знал. Вот так парсеры.

3. Согласен. Кэш MySQL действительно хорош, именно поэтому не обязательно помещать в файловый кэш результаты отдельных запросов. Выделение кэшу MySQL побольше ресурсов помогает. И стоит помнить: запросы с NOW() MySQL не кэширует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все эти моменты понятны и сьедены,

Вот другой момент, что делать с сео про...

Столкнулся с тем, что на 65 000 товаров, кеш урлов занимает 8.5Mb. - веселенькое дело...

 

И вот в этом методе:

		static $path = null;
		if (!is_array($path)) {
			$path = $this->cache->get('category.seopath');
			if (!is_array($path)) $path = array();
		}

		if (!isset($path[$category_id])) {
			$max_level = 10;

			$sql = "SELECT CONCAT_WS('_'";
			for ($i = $max_level-1; $i >= 0; --$i) {
				$sql .= ",t$i.category_id";
			}
			$sql .= ") AS path FROM " . DB_PREFIX . "category t0";
			for ($i = 1; $i < $max_level; ++$i) {
				$sql .= " LEFT JOIN " . DB_PREFIX . "category t$i ON (t$i.category_id = t" . ($i-1) . ".parent_id)";
			}
			$sql .= " WHERE t0.category_id = '" . $category_id . "'";

			$query = $this->db->query($sql);

			$path[$category_id] = $query->num_rows ? $query->row['path'] : false;

			$this->cache->set('category.seopath', $path);
		}

Возможно имеет смысл сделать одноразовую прегенерацию всех ссылок категорий, через формирование деревьев, а не пытаться посчитать отдельный кеш для каждой категории ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

там кеш формируется по мере необходимости, с этим проблем нет, но я бы заменил is_array($path) на !is_null($path)

в данном контексте это равнозначно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

там кеш формируется по мере необходимости, с этим проблем нет, но я бы заменил is_array($path) на !is_null($path)

в данном контексте это равнозначно

 

Там такая же необходимость, как формировать массив алиасов товаров!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все эти моменты понятны и сьедены,

Вот другой момент, что делать с сео про...

Столкнулся с тем, что на 65 000 товаров, кеш урлов занимает 8.5Mb. - веселенькое дело...

 

И вот в этом методе:

		static $path = null;
		if (!is_array($path)) {
			$path = $this->cache->get('category.seopath');
			if (!is_array($path)) $path = array();
		}

		if (!isset($path[$category_id])) {
			$max_level = 10;

			$sql = "SELECT CONCAT_WS('_'";
			for ($i = $max_level-1; $i >= 0; --$i) {
				$sql .= ",t$i.category_id";
			}
			$sql .= ") AS path FROM " . DB_PREFIX . "category t0";
			for ($i = 1; $i < $max_level; ++$i) {
				$sql .= " LEFT JOIN " . DB_PREFIX . "category t$i ON (t$i.category_id = t" . ($i-1) . ".parent_id)";
			}
			$sql .= " WHERE t0.category_id = '" . $category_id . "'";

			$query = $this->db->query($sql);

			$path[$category_id] = $query->num_rows ? $query->row['path'] : false;

			$this->cache->set('category.seopath', $path);
		}

Возможно имеет смысл сделать одноразовую прегенерацию всех ссылок категорий, через формирование деревьев, а не пытаться посчитать отдельный кеш для каждой категории ?

 

Мне тоже SeoPro не нравится, уж больно трудоемкий способ формирования ссылок. Я думаю, что в таблице url_alias надо хранить не какие-то кейворды, а полноценные url категорий и товаров, как-то так.

SeoPro определенно стоит улучшить в следующем релизе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне тоже SeoPro не нравится, уж больно трудоемкий способ формирования ссылок. Я думаю, что в таблице url_alias надо хранить не какие-то кейворды, а полноценные url категорий и товаров, как-то так.

SeoPro определенно стоит улучшить в следующем релизе.

 

А это мысль. Не проблема ведь при отключении включении ссылок (формировать с учетом категорий или без) переформировать все записи в таблице даже у 1000-1500 категорий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну... для этого нужно писать свой модуль ЧПУ.

 

Такой подход хорош при принципе: один товар - одна категория.

 

Но таки -да - красиво.... Красивый урл одним запросом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну... для этого нужно писать свой модуль ЧПУ.

 

Такой подход хорош при принципе: один товар - одна категория.

 

Но таки -да - красиво.... Красивый урл одним запросом.

 

А поле main в product_to_category, инопланетяне добавили ? 

Мне кажется из всех допилов OcStore - это самое существенное за всю историю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.