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

Есть ли модуль анализа лог файлов


dmonco

Recommended Posts

Да нет. Проблема не в этом. Проблема в том, что по каким-то причинам нагрузка перевышает лимит. И сайт пропадает.

С хостингом связывался. Нужно анализировать лог файл, чтобы узнать причину.

Согласен, анализировать в opencart это изврат. Буду искать программку или утилитку. Если кто знает такую, подскажите.

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


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

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


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

Себе я делал так:

В модель категорий добавил метод

	public function getAllCategories() {

		$category_data = $this->cache->get('category.all.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id'));

		if (!$category_data || !is_array($category_data)) {
			$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'  AND c.status = '1' AND c.sort_order <> '-1' ORDER BY c.sort_order, LCASE(cd.name)");

			$category_data = array();
			foreach ($query->rows as $row) {
				$category_data[$row['parent_id'] ][$row['category_id'] ] = $row;
			}

			$this->cache->set('category.all.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id'), $category_data);
		}

		return $category_data;
	}
Метод возвращает массив всех узлов. Кадый узел это массив с ключом равным parent_id элементов массива. Все узлы и элементы в узлах отсортированы в соответствии с тем как задано в админке.

Для построения многоуровневого списка надо обойти весь массив начиная от корня (узел 0) и при выводе каждой категории проверять наличие узла с ключом равным идентификатору категории. Если узел есть то выводим потомков, нету - выводим следующую категорию.

Для drop-down меню я в контроллере модуля категорий добавил свойство

protected $categories = array();
и метод

	protected function getAllCategories($parent_id = 0, $current_path = '') {
		$output = '';

		if (array_key_exists($parent_id, $this->categories)) {
			$results = $this->categories[$parent_id];

			$output .= '<ul>';

			foreach ($results as $result) {
				if (!$current_path) {
					$new_path = $result['category_id'];
				} else {
					$new_path = $current_path . '_' . $result['category_id'];
				}

				$output .= '<li>';

				$children = '';

				if (array_key_exists($result['category_id'], $this->categories)) {
					$children = $this->getAllCategories($result['category_id'], $new_path);
				}

				$href = $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $new_path);

//				if ($this->category_id == $result['category_id']) { // будет помечена только активная категория
				if (in_array($result['category_id'], $this->path)) { // будут помечены активная категория и все категории до корня
					$output .= '<a class="active" href="' . $href  . '">' . $result['name'] . '</a>';
				} else {
					$output .= '<a href="' . $href  . '">' . $result['name'] . '</a>';
				}

	        		$output .= $children;

	        		$output .= '</li>';
			}

			$output .= '</ul>';
		}

		return $output;
	}

В методе index такие изменения

//	$this->data['category'] = $this->getCategories(0);
	$this->categories = $this->model_catalog_category->getAllCategories();
	$this->data['category'] = $this->getAllCategories();
Всё... теперь при холодном старте только 1 запрос к БД, а не сотня как мне доводилось видеть.

А если не надо отмечать активные категории, например для superfish, можно смело кешировать результат работы метода getAllCategories и вообще забыть о нагрузке от категорий.

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

  • 7 months later...

Yesvik, а как на счет твоего метода в последней версии осStore? Там чуток другой алгоритм в методе модели категорий и на выходе другой по моему, другие данные.

class ModelCatalogCategory extends Model {
public function getCategory($category_id) {
  $query = $this->db->query("SELECT DISTINCT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.category_id = '" . (int)$category_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND c.status = '1'");
 
  return $query->row;
}
хелп плииз
Надіслати
Поділитися на інших сайтах


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

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

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

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

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

Вхід

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

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

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

×
×
  • Створити...

Important Information

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