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    190
$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    190

Да, ошибся:

$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    190

Проблема в файле скрипта 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 примет прежний вид. 

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

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


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

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

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

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

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

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

Войти

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

Войти


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

    • От AlekseyNomel
      Всем привет, кто работал с темой Journal2?
      Как после отзывов добавить еще один таб с сопуткой? Что-то не могу найти, в настройках шаба все облазил...
      oc 2.3 
      Спасибо.

    • От oc1c

      Скачать/Купить дополнение


      Обмен данными 1С и opencart
      Комплекс предназначен для управления содержимым интернет-магазина opencart из 1С.
      Экспорт товаров, обновление цен и остатков, импорт заказов, работа по расписанию.
       
      Внимание! В комплекте содержатся только инструкции по установке и настройке, а также описание API комплекса.
      Скачать сам комплекс можно на сайте oc1c.ru
       
      Текст обработки 1С специально написан и прокомментирован таким образом, чтобы даже новичок в программировании 1С легко в нём разобрался.
      Таким образом, можно подгонять задачи под себя, делать задачи по расписанию, остатки в режиме реального времени и т.д.
      Например, автоматическую выгрузку товара при его сохранении или коррекцию остатков по товару в случае его продажи/перемещения/поступления,
      изменение цены при переоценке и т.п.
       
      Важной особенностью технологии являются прямые чтение/запись в базу данных MySQL сайта, без использования PHP.
      Никаких файлов на сайт закачивать, и, тем более, заменять не нужно.
       
      Обмен данными 1С с сайтом можно производить в любое время, вне зависимости от количества посетителей и их активности.
      Кроме того, реализована работа по расписанию, так что комплекс может работать "постепенно", закачивая только изменения.
       
      Можно управлять несколькими сайтами, легко переключаясь между сохранёнными настройками формы обработки 1С.
      Можно использовать несколько баз данных 1С.
       
      В комплекте имеются инструкции по установке и настройке комплекса, а также описание API внешней компоненты.
       
      Скачать сам комплекс можно на сайте oc1c.ru
       
      Имеются готовые решения для следующих конфигураций 1С:
      1С 7.7 Торговля и склад 9.2 1С 8.1 Управление торговлей 10.3 1С 8.2 Управление торговлей 10.3 1С 8.3 Управление торговлей 10.3 1С 8.3 Управление торговлей 11.2 1С 8.3 Управление торговлей 11.3 1С 8.3 Управление торговлей 2.2 для Казахстана 1С 8.3. Управление производственным предприятием 1.3 1С 8.3 Розница 2 1С 8.3 MBC Детали машин 1С 8.3 Управление небольшой фирмой 1.6  
      Для работы с прочими конфигурациями требуется адаптация обработки 1С, с которой, имея описание API и одно из готовых решений, может справиться любой программист 1С.
      Вы можете заказать адаптацию, обратившись на почту mail@oc1c.ru
       
      Комплекс платный, но допускает работу в демо-режиме.
      В этом случае на Вашем сайте появятся несколько ссылок на ресурс oc1c.ru
       
      По вопросам приобретения лицензии обращайтесь на почту mail@oc1c.ru
      По вопросам технической поддержки обращайтесь на почту support@oc1c.ru
       
      Добавил oc1c Добавлено 27.12.2016 Категория Обмен данными Системные требования Сайт разработчика oc1c.ru Старая цена Метод активации По запросу на почту Ioncube Loader Нет OpenCart 2.3
      2.2
      2.1
      2.0
      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 Не проверялось  
    • От oc1c
      Комплекс предназначен для управления содержимым интернет-магазина opencart из 1С.
      Экспорт товаров, обновление цен и остатков, импорт заказов, работа по расписанию.
       
      Внимание! В комплекте содержатся только инструкции по установке и настройке, а также описание API комплекса.
      Скачать сам комплекс можно на сайте oc1c.ru
       
      Текст обработки 1С специально написан и прокомментирован таким образом, чтобы даже новичок в программировании 1С легко в нём разобрался.
      Таким образом, можно подгонять задачи под себя, делать задачи по расписанию, остатки в режиме реального времени и т.д.
      Например, автоматическую выгрузку товара при его сохранении или коррекцию остатков по товару в случае его продажи/перемещения/поступления,
      изменение цены при переоценке и т.п.
       
      Важной особенностью технологии являются прямые чтение/запись в базу данных MySQL сайта, без использования PHP.
      Никаких файлов на сайт закачивать, и, тем более, заменять не нужно.
       
      Обмен данными 1С с сайтом можно производить в любое время, вне зависимости от количества посетителей и их активности.
      Кроме того, реализована работа по расписанию, так что комплекс может работать "постепенно", закачивая только изменения.
       
      Можно управлять несколькими сайтами, легко переключаясь между сохранёнными настройками формы обработки 1С.
      Можно использовать несколько баз данных 1С.
       
      В комплекте имеются инструкции по установке и настройке комплекса, а также описание API внешней компоненты.
       
      Скачать сам комплекс можно на сайте oc1c.ru
       
      Имеются готовые решения для следующих конфигураций 1С:
      1С 7.7 Торговля и склад 9.2 1С 8.1 Управление торговлей 10.3 1С 8.2 Управление торговлей 10.3 1С 8.3 Управление торговлей 10.3 1С 8.3 Управление торговлей 11.2 1С 8.3 Управление торговлей 11.3 1С 8.3 Управление торговлей 2.2 для Казахстана 1С 8.3. Управление производственным предприятием 1.3 1С 8.3 Розница 2 1С 8.3 MBC Детали машин 1С 8.3 Управление небольшой фирмой 1.6  
      Для работы с прочими конфигурациями требуется адаптация обработки 1С, с которой, имея описание API и одно из готовых решений, может справиться любой программист 1С.
      Вы можете заказать адаптацию, обратившись на почту mail@oc1c.ru
       
      Комплекс платный, но допускает работу в демо-режиме.
      В этом случае на Вашем сайте появятся несколько ссылок на ресурс oc1c.ru
       
      По вопросам приобретения лицензии обращайтесь на почту mail@oc1c.ru
      По вопросам технической поддержки обращайтесь на почту support@oc1c.ru
       
    • От krAlexan
      Здравствуйте!
      У меня сайт на Opencart 3 - http://www.clipss.com.ua/, хостинг - https://www.ukraine.com.ua/
      Несколько дней назад я начал тестировать оформление заказа и возникла проблема в том, что только первый заказ был оформлен, пришло сообщение на Email администратору и клиенту, кроме того появился заказ в панели управления сайта (админка). Но все последующие тесты оформления заказа привели к тому, что заказ, как-бы, был оформлен, но сообщений на Email не было и в админке сайта эти заказы не появились, точнее появились в пропавших заказах.
      Возникла мысль, что проблема в коде ... я потратил много времени на проверку кода и когда не нашел никаких проблем решил скачать сайт и поставить на локальный сервер компьютера - там все отлично работает.
      После обращения в техподдержку хостинга, был дан ответ, что с их стороны нет никаких проблем. Они сделали 2 тестовых заказа, которые отработали как нужно.
      Я продолжил поиск проблемы и зашел на сайт с другого компьютера сделав еще тестовое оформление заказа, которое тоже верно отработало, но все последующие заказы с этого компьютера были заблокированы и опять попали в пропавшие.
      Тест с смартфона показал тот же результат - первый заказ отработал, все остальные нет.
      После этого я решил поставить "чистый" Opencart 3 на поддомен одного из сайтов того же хостинга.
      Здесь произошла та же ситуация - первый заказ работает, все остальные блокируются.
      Я решил попробовать поставить тот же "чистый" Opencart 3 на другой хостинг ... и к моему удивлению - все работает. Каждый заказ попадает в админку и об этом приходят сообщение на Email.
      Обратился в техподдержку хостинга - опять был дан ответ, что с их стороны все работает и они сделали около 10 тестовых заказов, которые, опять же, отлично отработали отправив сообщение на Email и появившись в админке.
      Пришла мысль, что проблема с моим IP, что-то вроде блокировки.
      Звонок другу с просьбой сделать пару тестовых заказов на сайте привели к тому же результату, что и у меня - первый заказ отрабатывает отлично, все остальные попадают в пропавшие заказы.
      Я понимаю, что скорее всего проблема в хостинге, но какая именно, не могу разобраться.
      Искал похожие проблемы на форуме, в Google и на других форумах, к сожалению ничего не нашел.
      Если у кого-то была похожая ситуация, расскажите, пожалуйста, как Вы ее решили или подскажите в чем может быть проблема?
      Спасибо.
    • От markimax

      690.00 руб
      Скачать/Купить дополнение


      Jet Cache :: SEO CMS 2 Джет Кеш - кеширование для магазинов

       

      Логин / пароль:
      demo / demo
       
      Документация  
      Более 10`000 интернет магазинов выбрали SEO CMS для работы
      SEO CMS JET CACHE :: Jet Cache - быстрая система кеширования страниц, контроллеров и методов моделей opencart
      Возможности
       
      - кеширует полностью страницы при полной интеграции с opencart (позволяет кешировать и для зарегистрированных пользователей и изменений корзины а также в зависимости от изменений в модулях)  
      - кеширует выбранные контроллеры (т е фактически  любые модули, будь то меню или т.п. а также полностью кеширует позиции (уникальная технология которая не реализовано ни в одном модуле кеширования для opencart) (с))  
      - кеширует методы моделей opencart (подсчет количества товаров и т п )  
      - простая установка и обновление  
      - гибкие настройки  
      - поддержка мультиязычности  
      - поддержка мультимагазинов  
      - поддержка протоколов https и http  
      - гибкая взаимосвязь с любым функционалом платформы SEO CMS  
      - совместимость с любой темой, любыми модулями, которые соответствуют стандартам программирования  
      - поддержка кеширования sitemap Чем модуль лучше других
       
      - уникальные технологии кеширования не имеющие аналогов в opencart (уникальная технология полной интеграции с opencart, в отличии от всех кешировщиков которые сделанны по технологии v2pc)  
      - модуль работает с любыми темами и модулями Требования
       
      Opencart 2.x или любая сборка на нем (ocStore, Opencart.PRO, или другие) PHP 5.3 или выше Модуль НЕ заменяет файлы системы Модуль НЕ использует ioncube  
      Совместимость модуля
       
      Opencart 2.x или любая сборка на нем (ocStore, Opencart.PRO, или другие) Любая тема или любые модули (которые сделаны без ошибок, согласно стандартов программирования или верстки) для оpencart 2.x  
      Установка, настройка
       
      Если пользователь хочет чтобы сотрудник службы технической поддержки проделал работу по установке и настройке модуля вместо пользователя на сервере пользователя, это уже услуга + 590 рублей  
      Лицензия Все права на модуль принадлежат разработчикам opencartadmin.com Условия использования лицензии: один домен - одна лицензия (покупка продукта для каждого домена). Условия использования лицензии - "на владельца". Далее... Добавил markimax Добавлено 15.03.2017 Категория Кэширование, сжатие, ускорение Системные требования PHP 5.3+ Сайт разработчика https://opencartadmin.com/seo-cms-jet-cache.html Старая цена 590 Метод активации Через официальный сайт дополнения Ioncube Loader Нет OpenCart 2.3
      2.2
      2.1
      2.0 ocStore 2.3
      2.2
      2.1 OpenCart.Pro, ocShop Opencart.pro 2.3
      Opencart.pro 2.1
      OcShop 2.0.3.х  
  • Последние посетители   0 пользователей онлайн

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