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

Улучшения сборки по мелочам...


Recommended Posts

Доброго времени, дамы и господа, предлагаю в данной теме обсуждать и принимать на заметку при создании новой версии сборки, так как код, из самого ОС не совсем грамотно написанный и иногда "экономия на подзапросе" в итоге может дать свои , хоть и маленькие, но миллисекунды в приросте...

 

Создание темы навеяно холиваром из темы, где продается решение, в принципе простое, но столь же эффективное...

Менее с тем, итак, заметка от Chukcha №1:

catalog\model\localisation\language.php

в методе getLanguages нет условия по выборке языка со статусом "вкл"|1|true... тоесть, в сам кеш, добавляеться весь массив языков и лишь в контроллере идёт перебор по условию типа:

if ($result['status']) {

но в самом файле кеша сидит "мёртвый язык"...

 

В итоге, имеет несколько вкладок в админке с включенными "мёртвыми" вкладками...

 

Ваши идеи господа !?

  • +1 1
Надіслати
Поділитися на інших сайтах

Всё же в админке, я бы в 310 строке заменил на:

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language WHERE status = 1 ORDER BY sort_order, name");

так и спокойней и правильней и в кеш ниче не полезет ненужного...

 

а то ведь смотри как в статьи идёт выборка в контроллере:

$this->load->model('localisation/language');
		
$this->data['languages'] = $this->model_localisation_language->getLanguages();

тоесть тут параметр $data = array() ... 

 

В итоге, имеет вкладки из "мёртвых языков"...

Надіслати
Поділитися на інших сайтах

У меня это не 310 строка.

	public function getLanguages($data = array()) {
		if ($data) {
			$sql = "SELECT * FROM " . DB_PREFIX . "language";
	
			$sort_data = array(
				'name',
				'code',
				'sort_order'
			);	
			
			if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
				$sql .= " ORDER BY " . $data['sort'];	
			} else {
				$sql .= " ORDER BY sort_order, name";	
			}
			
			if (isset($data['order']) && ($data['order'] == 'DESC')) {
				$sql .= " DESC";
			} else {
				$sql .= " ASC";
			}
			
			if (isset($data['start']) || isset($data['limit'])) {
				if ($data['start'] < 0) {
					$data['start'] = 0;
				}					

				if ($data['limit'] < 1) {
					$data['limit'] = 20;
				}	
			
				$sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
			}
			
			$query = $this->db->query($sql);
	
			return $query->rows;
		} else {
			$language_data = $this->cache->get('language');
		
			if (!$language_data) {
				$language_data = array();
				
				$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language WHERE status = '1' ORDER BY sort_order, name");
	
    			foreach ($query->rows as $result) {
      				$language_data[$result['code']] = array(
        				'language_id' => $result['language_id'],
        				'name'        => $result['name'],
        				'code'        => $result['code'],
						'locale'      => $result['locale'],
						'image'       => $result['image'],
						'directory'   => $result['directory'],
						'filename'    => $result['filename'],
						'sort_order'  => $result['sort_order'],
						'status'      => $result['status']
      				);
    			}	
			
				$this->cache->set('language', $language_data);
			}
		
			return $language_data;			
		}
	}

А точнее

 

public function getLanguages($data = array()) {

if ($data) {

Если хоть что-то есть в массиве.

} else{

Даже если массив пустой

}

Надіслати
Поділитися на інших сайтах

В controller/ /information

		$this->load->model('localisation/language');
		
		$this->data['languages'] = $this->model_localisation_language->getLanguages();
		
Т.е. $data будет пустым массивом
Надіслати
Поділитися на інших сайтах

Значит, 310 это у меня в бро смещено, это как раз строка с выборкой... то кстати там, если $data = array() тогда идет, исходя из нумерации твоей строки, то: 289... а там, как видим, проверка на файл кеша и т.д... в общем поправлено в запросе самом, остальное думаю трогать не стоит.

Надіслати
Поділитися на інших сайтах

Ну... тема создана на выявление и устранение таких вот мелких косяков и... доведения кода до состояния совершенства - вот цель топика.

 

P.S. Косяк с language - это не однократный момент рассмотрения в данной теме, позже будем добавлять по мере выявления другие недостатки и методы их устранения, а так же надеемся на активное участие сообщества, с целью совершенствования продукта.

Надіслати
Поділитися на інших сайтах

Долго думал

if ($store_query->num_rows) {
	$config->set('config_store_id', $store_query->row['store_id']);
} else {
	$config->set('config_store_id', 0);
}
		
// Settings
$query = $db->query("SELECT * FROM " . DB_PREFIX . "setting WHERE store_id = '0' OR store_id = '" . (int)$config->get('config_store_id') . "' ORDER BY store_id ASC");

Тайный смысл в 62-й строке

 

store_id = '0'

 

Или подразумевается, что могут быть общие настройки у магазинов?

Надіслати
Поділитися на інших сайтах

Во многих модулях настройки не привязаны к store_id

 

Что это меняет?

Я, действительно, понять не могу.

 

настройки берутся из get->config

Причем здесь id_store

Надіслати
Поділитися на інших сайтах

 

Или подразумевается, что могут быть общие настройки у магазинов?

 

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

 

ИМХО

Надіслати
Поділитися на інших сайтах


Что это меняет?

Я, действительно, понять не могу.

 

настройки берутся из get->config

Причем здесь id_store

Слава, сперва: $config->set( а потом, чуть ниже: $config->get(

 

Смысл в проверке таблицы с мультиками, если они есть, то соотв в индексе и делать выборку по указанным настройкам.

Надіслати
Поділитися на інших сайтах

BTW, здесь есть перспектива для мелкой оптимизации:

OR store_id = '" . (int)$config->get('config_store_id')

вставлять в запрос, только если

$config->get('config_store_id')!= 0

 Зачем выбирать мультики, если их в 99,7% случаев нет?

Надіслати
Поділитися на інших сайтах


BTW, здесь есть перспектива для мелкой оптимизации:

OR store_id = '" . (int)$config->get('config_store_id')

вставлять в запрос, только если

$config->get('config_store_id')!= 0

 Зачем выбирать мультики, если их в 99,7% случаев нет?

В том то и суть... а теперь если посмотреть более глобально, на запросы типа:

LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id)

то возникает резонный вопрос: "Нахера здесь вообще category_to_store и обращение к ней а потом ещё и условие типа:

AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'

Есть идеи ?

Надіслати
Поділитися на інших сайтах

В том то и суть... а теперь если посмотреть более глобально, на запросы типа:

LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id)

то возникает резонный вопрос: "Нахера здесь вообще category_to_store и обращение к ней а потом ещё и условие типа:

AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'

Есть идеи ?

А это как раз в угоду тем 0,3% с мультиками. Их ведь тоже со счетов сбрасывать нельзя.

 

И оптимизировать так же: включать или не включать в строку sql ту или иную конструкцию.

 

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

 

По уму, надо бы иметь две версии моделей, для немультиков и мультиков, и выбирать загрузку с учетом store_id != 0

Надіслати
Поділитися на інших сайтах


Ребяты, вы чего, SQL забыли?

Это же выбор категорий, привязанных к текущему магазину store_id.

так в том то и суть, что в 99 % магазинов эти таблицы - не затрагиваются вообще, только в корне прописалось и всё, потом просто гоняются в порожняке запросы... зачем если априори store_id == 0 ?

Надіслати
Поділитися на інших сайтах

так в том то и суть, что в 99 % магазинов эти таблицы - не затрагиваются вообще, только в корне прописалось и всё, потом просто гоняются в порожняке запросы... зачем если априори store_id == 0 ?

Мультимагазинность требует жертв :)

Надіслати
Поділитися на інших сайтах


Что это меняет?

Я, действительно, понять не могу.

 

настройки берутся из get->config

Причем здесь id_store

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

Поэтому в индексе получаем идентификатор магазина, для которого загружается конфиг и все, все, все.

Чтобы убрать мультимагазины нужно переписать половину запросов в движке и в результате получим экономию в 50 милисекунд..

Надіслати
Поділитися на інших сайтах

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

Поэтому в индексе получаем идентификатор магазина, для которого загружается конфиг и все, все, все.

Чтобы убрать мультимагазины нужно переписать половину запросов в движке и в результате получим экономию в 50 милисекунд..

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

Надіслати
Поділитися на інших сайтах

У меня например время генерации страницы около 0,4 сек. И профайлер говорит что 12% времени съедается на file_exist (мускуль ест крохи). А 50% времени - getChild. Вариант оптимизации этого есть?

Надіслати
Поділитися на інших сайтах

Для file_exist:

Занесите пути и имена всех существующих файлов в таблицу и запрашивайте мускуль.

Вернул строку - файл есть, пустой результат - файла нет.

 

Но обслуживание такого подхода может съесть всю экономию, если таковая будет

Надіслати
Поділитися на інших сайтах


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

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

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

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

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

Вхід

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

Вхід зараз
×
×
  • Створити...

Important Information

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