Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

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


Recommended Posts

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites


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

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

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

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

Link to comment
Share on other sites


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

Link to comment
Share on other sites


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

  • 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;
}
хелп плииз
Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.