Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

ОтВинта

  • записів
    7
  • коментарів
    57
  • переглядів
    2 909

Opencart на стероїдах


Vladzimir

1 724 перегляди

Переривши безліч інформації щодо кешу та кешування опенкарту, я так і не знайшов простого та бюджетного способу прискорити TTFB.

Час від часу я натрапляв на доповнення щодо кешу опенкарту для LiteSpeed.

Але чомусь я так і не знайшов жодної дієвої інструкції (та доповнення) як робити дієвий кеш опенкарту в Nginx, особливо якщо у вас шаблон залежний від типу пристрою.

І головною проблемою, яка постане перед вами при вирішенні цього питання це .... проксування куків з кешу і бекенду.

 

В кого є які думки з цього приводу?

 

Upd1

Дві функції які роблять твій сайт повільним

 

SmartBoost Before2.png

25 коментарів


Recommended Comments

On 5/29/2023 at 2:49 PM, Vladzimir said:

Хто знає точну адресу Даніеля?

Хочу йому надіслати гумового прутня.

Copyright © 2023 OPENCART LTD, All rights reserved.

Our mailing address is:
OpenCart Limited,
Unit G 2/F Tower 2 Avignon,
1 Kwun Chui Road, So Kwan Wat,
Tuen Mun,
Hong Kong

  • +1 1
Надіслати
В 30.05.2023 в 12:18, rb2 сказав:

Copyright © 2023 OPENCART LTD, All rights reserved.

Та навіщо порядну людину на роботі турбувати?

Я хотів зробити все по домашньому.

  • +1 2
Надіслати

Тут і не дивно, що в перших місцях База Даних!

 

Памятаю, як фіксив ІМ який грузився 13-20секунд особливо це відчувалось в категоріях =)

 

А все через меню і модуль extension/category (Категорії) який був включений, клієнт жаліється чому сайт так довго грузить. Тематика авто, відповідно 600+ категорій це марки машини, різні моделі і т.д.

 

Відключив модуль Категорії ІМ стало легше, проте результат ще не такий як хотілось з 13-20сек до 4-7сек)

 

І щоб повністю побороти цю хворобу, переписали меню і модуль категорії під кеш, один раз закешував меню і видаєш цей результат для всього сайту, і сайт просто ожив з 13-20секунд загрузка зменшилась до 500мс.

 

 

Ще були випадки з ІМ на слабому хостингу з відкриванням сторінки товарів коли товарів більше 50к - все із за метода updateViewed

 

public function updateViewed($product_id) {
		$this->db->query("UPDATE " . DB_PREFIX . "product SET viewed = (viewed + 1) WHERE product_id = '" . (int)$product_id . "'");
}

 

На перший погляд метод простий і нічого не повинно тормозити, проте коли його видаляли сайт оживав=)

Просто перевели його на AJAX виклик після 5 секунд перегляду сторінки, і в контролері видаляєм виклик методу.

$this->model_catalog_product->updateViewed($this->request->get['product_id']);

 

  • +1 1
Надіслати
В 06.06.2023 в 14:37, Eldaeron сказав:

Тут і не дивно, що в перших місцях База Даних!

База це вузьке місце майже в кожній CMS, але Данька зміг реалізувати проблему там де її не повинно бути - це модифікація файлів і події! Разом вони дають до 50% оверхеду навіть з майже пустим каталогом.

Надіслати
В 06.06.2023 в 15:37, chukcha сказав:

До чого тут модіфікація?

До того що в ній використовується is_file, результат якого не кешується системою, якщо файл відсутній. І таких викликів понад 1000 разів.

Надіслати
06.06.2023 в 14:37, Eldaeron сказал:

І щоб повністю побороти цю хворобу, переписали меню і модуль категорії під кеш, один раз закешував меню і видаєш цей результат для всього сайту, і сайт просто ожив з 13-20секунд загрузка зменшилась до 500мс.

 

Подскажите, а как можно переписать код меню, чтобы оно кешировалось? У меня на сайте тоже долго открываются страницы (примерно 2-5сек). Использую шаблон Аурус. Но если меняю шаблон на Default, то тот же сайт работает в 10 раз быстрее. Загрузка страниц (0,3-0,5сек). тоже автотематика и много категорий. Товаров, правда всего около 4000.

Надіслати
В 06.06.2023 в 18:35, shurc1 сказав:

Подскажите, а как можно переписать код меню, чтобы оно кешировалось? У меня на сайте тоже долго открываются страницы (примерно 2-5сек). Использую шаблон Аурус. Но если меняю шаблон на Default, то тот же сайт работает в 10 раз быстрее. Загрузка страниц (0,3-0,5сек). тоже автотематика и много категорий. Товаров, правда всего около 4000.

Треба дивитись код меню, версію opencart, якщо для 2.3 то меню в catalog/controller/common/header.php

 

Такий код:

$data['categories'] = array();

		$categories = $this->model_catalog_category->getCategories(0);

		foreach ($categories as $category) {
			if ($category['top']) {
				// Level 2
				$children_data = array();

				$children = $this->model_catalog_category->getCategories($category['category_id']);

				foreach ($children as $child) {
					$filter_data = array(
						'filter_category_id'  => $child['category_id'],
						'filter_sub_category' => true
					);

					$children_data[] = array(
						'name'  => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
						'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
					);
				}

				// Level 1
				$data['categories'][] = array(
					'name'     => $category['name'],
					'children' => $children_data,
					'column'   => $category['column'] ? $category['column'] : 1,
					'href'     => $this->url->link('product/category', 'path=' . $category['category_id'])
				);
			}
		}

 

Замінити на:

		$data['categories'] = array();

		if ($this->cache->get('header.categories.' . (int)$this->config->get('config_language_id'))) {
			$data['categories'] = $this->cache->get('header.categories.' . (int)$this->config->get('config_language_id'));
		} else {
			$categories = $this->model_catalog_category->getCategories(0);

			foreach ($categories as $category) {
				if ($category['top']) {
					// Level 2
					$children_data = array();

					$children = $this->model_catalog_category->getCategories($category['category_id']);

					foreach ($children as $child) {
						$filter_data = array(
							'filter_category_id'  => $child['category_id'],
							'filter_sub_category' => true
						);

						$children_data[] = array(
							'name'  => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
							'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
						);
					}

					// Level 1
					$data['categories'][] = array(
						'name'     => $category['name'],
						'children' => $children_data,
						'column'   => $category['column'] ? $category['column'] : 1,
						'href'     => $this->url->link('product/category', 'path=' . $category['category_id'])
					);
				}
			}

			$this->cache->set('header.categories.' . (int)$this->config->get('config_language_id'), $data['categories']);
		}

 

Про кеш можете почитати тут: 

 

  • +1 1
Надіслати
06.06.2023 в 15:40, Vladzimir сказал:

До того що в ній використовується is_file, результат якого не кешується системою, якщо файл відсутній. І таких викликів понад 1000 разів.

 

Это нивелируется NVME диском хостинга в нули. В полные нули!

80-120 ttfb без кешей, совершенно реальный показатель. Со страницами категорий сложнее, но тоже решаемо. 

И кстати, какая по вашему альтернатива ocmod или vqmod, превратить все в modx, привет изменения в базе и по кнопке выгружать набор исполняемых файлов?
Или с кешем изображений, привет WP - вот тебе три заготовленных миниатюры - ешь как хочешь?

 


По моему устоявшемуся мнению, проблема не в Opencart а в бомж-менталитете владельцев магазинов и инфоциган, которые рассказывают о том как в два клика расстаться с бедностью. Хотите быстрый магазин - никаких вопросов. Пользуйте не бюджетные сервера и ни в коем случае не шаред хостинги. Чуть чуть это все настроить. Чуть чуть разобраться в проблемах и магазина и кривых надстройках. И все... до свидания головная боль. А сколько раз там оно делает is_file, да кому какая разница, если лишиться этой головной боли стоит +15-20 долларов в месяц за нормальный хост?

Надіслати
06.06.2023 в 14:37, Eldaeron сказал:

Ще були випадки з ІМ на слабому хостингу з відкриванням сторінки товарів коли товарів більше 50к - все із за метода updateViewed

Подскажите, пожалуйста, а как Вы поняли, что проблема именно в этой функции? Как понять, какая функция тянет на себя львиную долю времени при открытии страницы?

Надіслати
06.06.2023 в 15:42, Vladzimir сказал:

Якось так

SmartBoost Before.png

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

Надіслати
В 07.06.2023 в 01:14, Yoda сказав:

Это нивелируется NVME диском хостинга в нули. В полные нули!

Ця поведінка нівелюється іншим способом. І вона майже не залежить від типу та швидкості дисків. Що і доводить профайлер.

Про це навіть в офдокументації написано https://www.php.net/manual/en/function.clearstatcache.php  "You should also note that PHP doesn't cache information about non-existent files."

Надіслати
В 07.06.2023 в 11:37, shurc1 сказав:

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

Профайлер xhprof

Надіслати
07.06.2023 в 11:40, Vladzimir сказал:

Ця поведінка нівелюється іншим способом. І вона майже не залежить від типу та швидкості дисків. Що і доводить профайлер.

Про це навіть в офдокументації написано https://www.php.net/manual/en/function.clearstatcache.php  "You should also note that PHP doesn't cache information about non-existent files."

 

 

Ну про это я в курсе

 Вопрос в другом. 

Какая альтернатива реализации is_file?

 

Держать таблицу с набором флагов созданных кешей изображений?

 

Так не очень вариант, если их будет 20к+

 

Выход какой? Альтернатива? 

Надіслати
В 07.06.2023 в 18:34, Yoda сказав:

Держать таблицу с набором флагов созданных кешей изображений?

Навіщо? is_file нормально працює коли файл існує. Проблема актуальна саме для modification коли перевіряється чи є модифікований файл.

Надіслати
07.06.2023 в 18:58, Vladzimir сказал:

Навіщо? is_file нормально працює коли файл існує. Проблема актуальна саме для modification коли перевіряється чи є модифікований файл.

Внимательно смотрим в tool/image модификаторы - детский лепет.

  • +1 1
Надіслати
06.06.2023 в 15:42, Vladzimir сказал:

Якось так

SmartBoost Before.png

 

Я так понимаю, что на этом скрине видно результат профилирования какой-то конкретной страницы на сайте (а не отдельного файла контроллера или файла модели) ? Т.е. вся страница загрузилась примерно за 0,4сек.

 

Подскажите, пожалуйста, как Вы это сделали? Где вы прописали (в каком файле и в каком месте) xhprof_enable(); и потом xhprof_disable() ?

 

У меня долго открываются странциы на сайте (примерно 3-5сек). И страницы товаров, и категорий, и даже информационные страницы - все долго загружаются. Но не могу понять, в чем причина.

Я установил xhprof себе на VPS.

Но не пойму, как правильно отпрофилировать какую-то конкретную страницу на сайте, которая долго грузится? Отдельный файл контроллера получается - просто в начале контрллера прописываю xhprof_enable() со всеми необходимыми параметрами, а в конце xhprof_disable().

А вот как всю страницу отпрофилировать не пойму.

Надіслати
11.08.2023 в 23:12, shurc1 сказал:

Где вы прописали (в каком файле и в каком месте) xhprof_enable(); и потом xhprof_disable() ?

даст возможность выявить "узкие места" и предпринять меры по оптимизации сайта и базы данных OpenCart более точечно и направлено.

Надіслати

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.