uorypm

Кэш. Class Cache. Проблема с генерацией непонятной строки

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

uorypm    0

Здравствуйте, форумчане!

 

Есть файл контроллера, в котором запрашивается кэш:

$product_data = $this->cache->get('product.total.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache);

Есть системный класс Cache, в котором есть метод get.

 

 

Проблема в том, что из файла контроллера запрашивается строка вида "product.total.1.0.1.$cache" (где $cache - это некая сгенерированная строка). А в метод get класса Cache приходит непонятно почему такая строка: "product.total.1.0.1.cfcd208495d565ef66e7dff9f98764da.$cache".

 

Ссылка $this в файле контроллера ссылается на объект $registry класса Registry, в нем зарегистрирован экземпляр класса Cache. Т.е. вроде бы все нормально.

 

При этом метод set класса Cache записывает кэш как и положено - в виде файла с именем "product.total.1.0.1.$cache". Т.е. сейчас кэш для файлов "product.total.1.0.1.*" вообще не используется и CMS постоянно обращается к БД.

 

Временно метод get класса Cache изменил так:

	public function get($key) {
		if(preg_match('/^product\.total\.1\.0\.1\.cfcd208495d565ef66e7dff9f98764da.*$/', $key))
		{
			$key = str_replace('cfcd208495d565ef66e7dff9f98764da.', '', $key);
		}

	// ...

	}

Кто-нибудь с таким сталкивался и откуда и почему вставляетяс строка "cfcd208495d565ef66e7dff9f98764da" в имя файла кэша?

 

Спасибо.

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


Ссылка на сообщение
Поделиться на другие сайты
halfhope    154
$cache = '1.0.1.cfcd208495d565ef66e7dff9f98764da' ;

Все правильно работает.

1. Напишите полный код класса Cache под спойлером.

2. И код контроллера, который запрашивает данные из кэша.

3. Как определили, что кэш не используется?

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


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

1. Код класса Cache

<?php
class Cache { 
	private $expire = 3600; 

	public function get($key) {
		if(preg_match('/^product\.total\.1\.0\.1\.cfcd208495d565ef66e7dff9f98764da.*$/', $key))
		{
			$key = str_replace('cfcd208495d565ef66e7dff9f98764da.', '', $key);
			//echo $key , "<br/>\r\n";
		}
		$files = glob(DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.*');
		
		if ($files) {
			$cache = file_get_contents($files[0]);
			
			$data = unserialize($cache);
			
			foreach ($files as $file) {
				$time = substr(strrchr($file, '.'), 1);

      			if ($time < time()) {
					if (file_exists($file)) {
						unlink($file);
					}
      			}
    		}
			
			return $data;			
		}
	}

  	public function set($key, $value) {
    	$this->delete($key);
		
		$file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.' . (time() + $this->expire);
    	
		$handle = fopen($file, 'w');

    	fwrite($handle, serialize($value));
		
    	fclose($handle);
  	}
	
  	public function delete($key) {
		$files = glob(DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.*');
		
		if ($files) {
    		foreach ($files as $file) {
      			if (file_exists($file)) {
					unlink($file);
				}
    		}
		}
  	}
}
?>

 

2. Модель, не контроллер. Вот код метода:

<?php
	public function getTotalProducts($data = array()) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		} else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}	
				
		$cache = md5(http_build_query($data));
		
		$product_data = $this->cache->get('product.total.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache);
		
		if (!$product_data and $product_data === NULL) {
			
			$sql = "SELECT COUNT(DISTINCT p.product_id) AS total FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)";
	
			if (!empty($data['filter_category_id'])) {
				$sql .= " LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id)";			
			}
						
			$sql .= " WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";
			
			if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {
				$sql .= " AND (";
				
				if (!empty($data['filter_name'])) {					
					if (!empty($data['filter_description'])) {
						$sql .= "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "%' OR MATCH(pd.description) AGAINST('" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "')";
					} else {
						$sql .= "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "%'";
					}
				}
				
				if (!empty($data['filter_name']) && !empty($data['filter_tag'])) {
					$sql .= " OR ";
				}
				
				if (!empty($data['filter_tag'])) {
					$sql .= "MATCH(pd.tag) AGAINST('" . $this->db->escape(utf8_strtolower($data['filter_tag'])) . "')";
				}
			
				$sql .= ")";
				
				if (!empty($data['filter_name'])) {
					$sql .= " OR LCASE(p.model) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
				}
				
				if (!empty($data['filter_name'])) {
					$sql .= " OR LCASE(p.sku) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
				}	
				
				if (!empty($data['filter_name'])) {
					$sql .= " OR LCASE(p.upc) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
				}		

				if (!empty($data['filter_name'])) {
					$sql .= " OR LCASE(p.ean) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
				}

				if (!empty($data['filter_name'])) {
					$sql .= " OR LCASE(p.jan) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
				}
				
				if (!empty($data['filter_name'])) {
					$sql .= " OR LCASE(p.isbn) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
				}		
				
				if (!empty($data['filter_name'])) {
					$sql .= " OR LCASE(p.mpn) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";
				}				
			}
						
			if (!empty($data['filter_category_id'])) {
				if (!empty($data['filter_sub_category'])) {
					$implode_data = array();
					
					$implode_data[] = (int)$data['filter_category_id'];
					
					$this->load->model('catalog/category');
					
					$categories = $this->model_catalog_category->getCategoriesByParentId($data['filter_category_id']);
										
					foreach ($categories as $category_id) {
						$implode_data[] = (int)$category_id;
					}
								
					$sql .= " AND p2c.category_id IN (" . implode(', ', $implode_data) . ")";			
				} else {
					$sql .= " AND p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
				}
			}		
			
			if (!empty($data['filter_manufacturer_id'])) {
				$sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
			}
			
			$query = $this->db->query($sql);
			
			$product_data = $query->row['total']; 
			
			$this->cache->set('product.total.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache, $product_data);
		}
		
		return $product_data;
	}

 

3. Изначальная причина была в том, что сайт работал медленно. Системный администратор, потом и я, проверил нагрузку на сервер - нагрузка на сервер действительно была очень большой (не такой, какой должна была быть при работе с кэшем). Была поставлена мне задача. Посмотрел папку с кэшем - кэш создается под одним именем, а запрашивается под другим (в следствие чего создается новый запрос к БД и сайт работает медленно, а сервер под нагрузкой).

 

---------------------------

 

Откуда инфа, что $cache = '1.0.1.cfcd208495d565ef66e7dff9f98764da' ? Эта переменная вообще по-другому формируется.

 

В модели выводил на экран передаваемый текст - был один вариант (собственно, под каким и сохранялся кэш), а в метод класса приходит уже другой (а кэша с таким именем уже нет)!

При том такой запрос кэша формируется только в этом методе и только в этой модели! Т.е. только для кэшей которые начинаются с product.total.1.0.1.*.

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


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

Да, ошибся:

$cache = md5(http_build_query($data)); //cfcd208495d565ef66e7dff9f98764da

Значит имя файла кэша cache.product.total.1.0.1.cfcd208495d565ef66e7dff9f98764da.$UTC. 

if (!$product_data and $product_data === NULL) {
//замените на 
if (empty($product_data)) {

Пришлите в ЛС данные для доступа к магазину или сорцы с БД на talgatks@gmail.com, я посмотрю. 

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


Ссылка на сообщение
Поделиться на другие сайты
uorypm    0
Пришлите в ЛС данные для доступа к магазину или сорцы с БД на talgatks@gmail.com, я посмотрю. 

 

К сожалению, это невозможно.

 

debug_backtrace'ом выяснил, что среди прочих вызывается файл "/vqmod/vqcache/vq2-catalog_model_catalog_product.php" и в нем вызывается тот самый метод класса, но строка к кэшу формируется уже по-другому:

// Start filter change
	    $product_data = $this->cache->get('product.total.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.'.md5($filter). '.'. $cache); 
// End filter

Сравните с исходным запросом:

$product_data = $this->cache->get('product.total.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache);

 

Т.е. как раз тут и вставляется эта злополучная строка прямо посреди текста - " .md5($filter). ".

 

С vQmod никогда не работал. Как наиболее правильно исправить такую работу этого мода? Или ничего страшного, ели вмешаться в код напрямую?

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


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

Проблема в файле скрипта vQmod '/vqmod/xml/vqmod_filter_products.xml' :

 

	<operation>
            <search position="replace"><![CDATA[
            $product_data = $this->cache->get('product.total.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache);
            ]]></search>
            <add><![CDATA[
// Start filter change
	    $product_data = $this->cache->get('product.total.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.'.md5($filter). '.'. $cache); 
// End filter
            ]]></add>
        </operation>

 

Переменная $filter всегда имеет значение int(0), следовательно, md5(0) имеем - "cfcd208495d565ef66e7dff9f98764da".

 

Следует просто переписать замещающий код? Из знающих vQmod никто не подскажет? Нужна ли вообще переменная $filter и в каких случаях?

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


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

Проблема в файле скрипта vQmod '/vqmod/xml/vqmod_filter_products.xml' :

 

	<operation>
            <search position="replace"><![CDATA[
            $product_data = $this->cache->get('product.total.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache);
            ]]></search>
            <add><![CDATA[
// Start filter change
	    $product_data = $this->cache->get('product.total.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.'.md5($filter). '.'. $cache); 
// End filter
            ]]></add>
        </operation>

 

Переменная $filter всегда имеет значение int(0), следовательно, md5(0) имеем - "cfcd208495d565ef66e7dff9f98764da".

 

Следует просто переписать замещающий код? Из знающих vQmod никто не подскажет? Нужна ли вообще переменная $filter и в каких случаях?

 

Это XML файл какого-то модуля фильтра, если этот фильтр не используется на сайте, то можете просто переименовать vqmod_filter_products.xml на vqmod_filter_products.xml.bak, при обновлении страницы vqmod его не обработает и файл /vqmod/vqcache/vq2-catalog_model_catalog_product.php примет прежний вид. 

Если же этот фильтр используется, то обратитесь к его автору. Если же понадобится помощь, то я уже писал ранее свои контакты.

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


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

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

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

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

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

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

Войти

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

Войти


  • Похожий контент

    • От katilina


      Просмотр файла July - адаптивный шаблон для ocStore/Opencart
      Адаптивный шаблон July.
      разработчики ShopUtils и Katilina
      Скидка на шаблон действует до 1 сентября!
      Демо для версии ocstore - opencart 2.0.x - 2.1.x -2.2.x - 2.3
      Версия для 2.3.x - скачивайте архив july_ocstore_opencart_2.3_v2.16.07.14.zip

      april.mattimeo.ru
      mart.mattimeo.ru
      august.mattimeo.ru
      ДОКУМЕНТАЦИЯ april.mattimeo.ru/documentation
       
      Демо для версии ocstore 1.5.5.1.2

      july.mattimeo.ru
      may.mattimeo.ru
      june.mattimeo.ru
      Внимание! Версии шаблона под 1.5.х и под 2.х лицензируются отдельно даже для одного домена.
      Ключ на домен, у которого уже есть ключ для версии 15512, выдаётся за дополнительную плату 1500 руб.
      Поддержка движка другой версии в цену одного шаблона не входит
       

       
      Системные требования:
      - ocStore v1.5.4.x - 2.3.x / Opencart 1.5.4.x - 1.5.6.x, Opencart 2.0.x - 2.1.x - 2.2.x - 2.3.x
      Будьте внимательны при установке движка. Opencart.Pro с шаблоном не протестирован.
      - Ioncube Loader v4.5+ (для 2.x - 5.0+)
      - PHP v5.3+
      - vQmod v2.4.1 (только для 1.5.x)
      В версии шаблона для 2.0.x - 2.1.x - 2.2.x
      - Вы можете включить отображение опций в модулях и в выбранных категориях ( опции в блоке товара или в модальном окне на Ваш выбор)
      - Выбор количества товара в модулях и в категориях
      - Выбор сеток товара на странице категорий ( по 5, 4, 3 в ряд или 2 вида списка)
      - Новости с категориями
      - Дополнительные модули для новостей ( избранные, последние, тэги, разделы новостей)
      - Возможность прикреплять товары к новостям
       

       
      July тема - позитивный и чистый шаблон. Если Вы хотите иметь уникальный, привлекательный дизайн и пытаетесь сделать свой стиль среди многочисленных владельцев магазинов, July тема является прекрасной отправной точкой для Вас.
      Демо-данные высылаются по просьбе покупателя
      http://july.mattimeo.ru/docs/img/boots.png Шаблон использует технологию вёрстки bootstrap3
      http://july.mattimeo.ru/docs/img/user_part2.jpg
      Мы стараемся для Вас. Если Вам понравилась тема, не забудьте поставить 5 звёздочек
      В шаблоне есть также модуль новостей, подписка на новости магазина,
      возможность очистить кэш из админ панели управления сайтом.
      Вы можете загрузить настройки шаблона, сохранить настройки шаблона.
      Список модулей будет увеличиваться.
      Рекомендуем модули
      1. Живая цена - Динамическое обновление цены
      2. FilterPro Патч для модуля в архиве july_for_filterpro.zip
      3. SEO CMS TOP 2: Блог | Новости | Отзывы | Галерея | Формы
      4. Дополнительные вкладки на странице товара Патч для шаблона, купившим модуль
      Добавил katilina Добавлено 09.11.2015 Категория Платные шаблоны Системные требования ocStore v1.5.4.x - 2.x / Opencart 1.5.4.x - 1.5.6.x, Opencart 2.0.x - 2.1.x - 2.2.x - 2.3.xIoncube Loader v4.5+ (для 2.x - 5.0+)PHP v5.3+vQmod v2.4.1+ (только для 1.5.x) Сайт разработчика Старая цена 3000 Метод активации По запросу в ЛС Ioncube Loader Требуется OpenCart 2.3
      2.2
      2.1
      1.5.6.4
      1.5.6.3
      1.5.6.2
      1.5.6.1
      1.5.6
      1.5.4.1 ocStore 2.3
      2.2
      2.1
      1.5.5.1.2
      1.5.5.1.1
      1.5.5.1
      1.5.4.1.2
      1.5.4.1.1
      1.5.4.1 OpenCart.Pro, ocShop  
    • От katilina
      Адаптивный шаблон July.
      разработчики ShopUtils и Katilina
      Скидка на шаблон действует до 1 сентября!
      Демо для версии ocstore - opencart 2.0.x - 2.1.x -2.2.x - 2.3
      Версия для 2.3.x - скачивайте архив july_ocstore_opencart_2.3_v2.16.07.14.zip

      april.mattimeo.ru
      mart.mattimeo.ru
      august.mattimeo.ru
      ДОКУМЕНТАЦИЯ april.mattimeo.ru/documentation
       
      Демо для версии ocstore 1.5.5.1.2

      july.mattimeo.ru
      may.mattimeo.ru
      june.mattimeo.ru
      Внимание! Версии шаблона под 1.5.х и под 2.х лицензируются отдельно даже для одного домена.
      Ключ на домен, у которого уже есть ключ для версии 15512, выдаётся за дополнительную плату 1500 руб.
      Поддержка движка другой версии в цену одного шаблона не входит
       

       
      Системные требования:
      - ocStore v1.5.4.x - 2.3.x / Opencart 1.5.4.x - 1.5.6.x, Opencart 2.0.x - 2.1.x - 2.2.x - 2.3.x
      Будьте внимательны при установке движка. Opencart.Pro с шаблоном не протестирован.
      - Ioncube Loader v4.5+ (для 2.x - 5.0+)
      - PHP v5.3+
      - vQmod v2.4.1 (только для 1.5.x)
      В версии шаблона для 2.0.x - 2.1.x - 2.2.x
      - Вы можете включить отображение опций в модулях и в выбранных категориях ( опции в блоке товара или в модальном окне на Ваш выбор)
      - Выбор количества товара в модулях и в категориях
      - Выбор сеток товара на странице категорий ( по 5, 4, 3 в ряд или 2 вида списка)
      - Новости с категориями
      - Дополнительные модули для новостей ( избранные, последние, тэги, разделы новостей)
      - Возможность прикреплять товары к новостям
       

       
      July тема - позитивный и чистый шаблон. Если Вы хотите иметь уникальный, привлекательный дизайн и пытаетесь сделать свой стиль среди многочисленных владельцев магазинов, July тема является прекрасной отправной точкой для Вас.
      Демо-данные высылаются по просьбе покупателя
      http://july.mattimeo.ru/docs/img/boots.png Шаблон использует технологию вёрстки bootstrap3
      http://july.mattimeo.ru/docs/img/user_part2.jpg
      Мы стараемся для Вас. Если Вам понравилась тема, не забудьте поставить 5 звёздочек
      В шаблоне есть также модуль новостей, подписка на новости магазина,
      возможность очистить кэш из админ панели управления сайтом.
      Вы можете загрузить настройки шаблона, сохранить настройки шаблона.
      Список модулей будет увеличиваться.
      Рекомендуем модули
      1. Живая цена - Динамическое обновление цены
      2. FilterPro Патч для модуля в архиве july_for_filterpro.zip
      3. SEO CMS TOP 2: Блог | Новости | Отзывы | Галерея | Формы
      4. Дополнительные вкладки на странице товара Патч для шаблона, купившим модуль
    • От kolyabis
      Добрый день. Прошу подсказки по настройкам. Буду очень признателен, или если кто то может за умеренную плату поднять сайт на VPS
       
      Я использую хостинг ukraine.com.ua заказал у них VPS, поставил CosOC 6.8 и сверху поставил ISPmanager 4 чтоб по консоли не лазить.
      Создал пользователя, перешел под его правами. Создал домен, базу, все скопировал и поднял. Когда запустил в браузере мне начало ругаться на 403 ошибку. Я полез в .htaccess, через некоторое время я понял что проблема с правами, а так как я такого особо никогда не делал, то у меня тут начинают выли тать разные ошибки. 
      Сайт на простом хостинге отработал как минимум год, после переноса на vps работать не хочет.
    • От Jonsonnnn
      Всем привет! Интересует мнение профи opencart по поводу шаблона лайтшоп.
       
      Стоит ли его покупать ? Оправдана цена за такой шаблон? Какие могут с ним возникнуть подводные камни ? 
       
      Есть ли у кого-то готовый магазин который уже работает ? 
      Хотелось бы услышать мнение специалистов, а то не хотелось бы выкинуть деньги на ветер 
    • От nikeforce111
       Добрый день,
      Интересует такой вопрос, можно ли сделать или разработать калькулятор для отдельной категории на ocstore 1.5.5.1.2 либо может есть возможность приобрести какой то модуль? подскажите пожалуйста
      Категория называется дымоходы, в ней будет очень много труб и комплектующих. 
      На сегодняшний день там просто куча товара, который можно подобрать с помощью фильтра. Но это не весь товар будет еще добавляться около 1000 товаров, а то и более и будет бардак.
      Очень понравился калькулятор вот на это сайте, хотелось бы на подобии как вот тут www.ochag.by/catalog/dymo... только для отдельной категории ДЫМОХОДЫ 


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

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