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

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

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

Всем привет.

Кто знает, существует ли модуль в opencart для анализа лог файлов?

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


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

Чего там анализировать-то? Курс доллара предсказывать что-ли? :)

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


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

Чего там анализировать-то? Курс доллара предсказывать что-ли? :)

Скорее всего рефы.

Но держать такой модуль в OpenCart это изврат...

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


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

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

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

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

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


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

а можно глянуть сайт?)

и примерную статистику посещения за день?)

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


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

а можно глянуть сайт?)

и примерную статистику посещения за день?)

Да, пожалуйста: Glostore

Там внизу баннеры на статистику. Она доступна.

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


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

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

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


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

Очень часто мелькают темы в которых упоминается про категории которые создают большую нагрузку, например в поиске или для 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 9

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


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

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;
}
хелп плииз

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


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

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

..

насколько мне известно, этот алгоритм попал в сборку 1,5,1,3

  • +1 2

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


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

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

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

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

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

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

Войти

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

Войти

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

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

×

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

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