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

Кэширование через memcached и драйвер mysql_cached


UncleAndy

Recommended Posts

Сделал две модификации для улучшения кэширования через memcached. Может быть полезно при большой нагрузке и/или использовании нескольких бэкэндов с общим кэшем.

1. Модификация system/library/cache.php для возможности работать с Memcached. Параметры в config.php:

define('CACHE_DRIVER', 'memcached');

define('MEMCACHE_HOSTNAME', 'localhost');

define('MEMCACHE_PORT', '11211');

define('MEMCACHE_NAMESPACE', 'opencart_test');

При другом значении CACHE_DRIVER или отсутствии соединения с сервером memcached, будет использоваться стандартное кэширование в файлы.

2. Сделал вариант драйвера БД mysql_cached, в котором кэшируются запросы SQL. Время кэширования настривается через config.php:

define('DB_CACHED_EXPIRE', 120);

Для сброса всего SQL кэша можно поместить текущее время time() в кэшь с ключем "sql_globalresetcache".

PS. В данный момент делаю драйвер БД для postgresql.

cache.php

mysql_cached.php

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


Я сейчас контактирую с разработчиками. Вполне вероятно, что в районе версии 1.5.1 эти изменения войдут в основную ветку. Возможно, вместе с драйвером для Postgresql. :)

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


Имя файла: Драйвер БД Mysql с кэшированием запросов

Владелец файла: UncleAndy

Файл размещен: 08 марта 2011

Категория файла: Прочее

Дополнительный драйвер БД для Mysql, в котором происходит кэширование всех SELECT запросов. Время кэширования SQL запросов в секундах задается в config.php:

define('DB_DRIVER', 'mysql_cached');

define('DB_CACHED_EXPIRE', 120);

Нажмите сюда, чтобы скачать этот файл

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


Для драйвера БД mysql_cached:

1. Ложите файл mysql_cached.php в каталог system/database/.

2. В корне магазина в файле config.php меняете строку

define('DB_DRIVER', 'mysql');

на

define('DB_DRIVER', 'mysql_cached');

и добавляете

define('DB_CACHED_EXPIRE', 120);

НЕ рекомендую ставить этот драйвер в конфигурации админки. Т.к. в админку НЕ встроены средства сброса кэша и это чревато различными "глюками".

Для новой библиотеки кэширования:

1. Берете файл cache.php и перезаписываете им файл system/library/cache.php. Эта процедура не нарушит работу сайта - будет использоватся обычный файловый кэшь.

2. Устанавливаете в системе (или на другом сервере) сервер memcached и запускаете его. Это делается просто - без каких-то особенностей. Единственное, что если будете использовать кэширование в memcached совместно с mysql_cached, скорей всего в конфиге memcached нужно будет увеличить размер используемой памяти. На CentOS, например, после установки выделяется 65 Мб.

2. Идете в корень магазина и текстовым редактором дописываете в config.php строки конфигурации (с параметрами своего memcached сервера):

define('CACHE_DRIVER', 'memcached');

define('MEMCACHE_HOSTNAME', 'localhost');

define('MEMCACHE_PORT', '11211');

define('MEMCACHE_NAMESPACE', 'opencart_test');

Рекомендую эти-же параметры прописать в файле конфигурации админки - admin/config.php. Сейчас это не очень принципиально, но, надеюсь, в будущем в админке добавяться опции управления кэшем.

Параметр MEMCACHE_NAMESPACE нужен для варианта когда одним сервером memcached будут пользоваться разные магазины - для разделения их кэшей.

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


  • 3 weeks later...

Спешу поделиться кучей впечатлений от использования сего драйвера (mysql_cached.php).

Скачал, установил. И начались чудеса.

Во-первых, втрое увеличилось время реагирования на клик. Если раньше, после клика на любой линк, картинку и т.п. он открывался в течении 1 секунды, то после установки этого драйвера стало жутко тормозить. Кликаю на ссылку, проходит не меньше 3 секунд и только тогда открывается новая страница. Я уж было начал грешить на кучу джавовских кодов, которые понатыканы в скрипте Опенкарта, плюс я там подоставлял ещё... Но раньше-то открывалось втрое быстрее!!! Но это ещё не все чудеса...

Поменял в админке текст в новостях и ещё названия нескольких категорий поменял. Обновляю сайт - ничего не изменилось (текст не поменялся, категории - тоже). Помня, что, как говорится "вас предупреждалось", что с этим драйвером такое возможно, подождал пять минут. Обновил сайт. Ничего не изменилось. Подождал ещё 5 минут. Обновил. Всё по-старому. Надоело ждать, снёс его, нафиг...

А теперь вопрос. А файле стоит время кеширования - 120 секунд. Т.е., 2 минуты. Почему у меня и за 10 минут ничего не изменилось? И почему драйвер так мощно тормозит сайт? Насколько я понял, он должен не тормозить, а ускорить работу? Или я что-то не так понял?

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


При использовании файлового кэша результат не однозначен. Улучшение может быть если использовать memcached. В принципе, драйвер и писался в расчете на это.

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


  • 2 months later...

версия 0.2.0

изменения внесены - установлены доп. модули.

сайт на хостинге.

ошибка в журнале:

2011-05-30 0:10:59 - PHP Warning: file_get_contents(/system/cache/cache.sql_75830e0454c7be0b20d6da68f8fc3b96.1306699858) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: No such file or directory in /system/library/cache.php on line 52

Может я что-то не так сделал при установке? Где копать проблему, подскажите пожалуйста...

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


ошибка в журнале:

2011-05-30 0:10:59 - PHP Warning: file_get_contents(/system/cache/cache.sql_75830e0454c7be0b20d6da68f8fc3b96.1306699858) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: No such file or directory in /system/library/cache.php on line 52

Может я что-то не так сделал при установке? Где копать проблему, подскажите пожалуйста...

Пути проверте. Явно неправильно задан каталог для хранения кэша в виде файлов.

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


UncleAndy, вам не кажется, что ошибок было бы больше :huh: , если бы неправильно был задан каталог для хранения кэша?
Надіслати
Поділитися на інших сайтах

2011-05-30 0:10:59 - PHP Warning: file_get_contents(/system/cache/cache.sql_75830e0454c7be0b20d6da68f8fc3b96.1306699858) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: No such file or directory in /system/library/cache.php on line 52

Эта строка появилась в ревизии 69.

Скорее всего файл успел удалиться к тому времени, как его попытались прочитать. Надо переписать как-то так:

if ($files && $cache = @file_get_contents($files[0]))    
            return unserialize($cache); 
        }
  • +1 1
Надіслати
Поділитися на інших сайтах


У Вас ошибочка в код закралась небольшая в виде знака &

Сделал чуток по-другому:


public function get($key) {
    	if (($this->cachedriver == 'memcached') && $this->ismemcache)
    	{
		return($this->memcache->get(MEMCACHE_NAMESPACE . $key, 0));
    	}
    	else
    	{
		$files = glob(DIR_CACHE . 'cache.' . $key . '.*');

		if ($files && ($cache = file_get_contents($files[0]))) {
			return unserialize($cache); 
		}
    	}
  	}


Но всё равно спасибо)

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


А, ну да, && выполняется раньше чем =, так что надо взять в скобки часть выражения:

$cache = file_get_contents($files[0])
ну или заменить && на and

karapuzam: а вот собаку (@) перед file_get_contents вы зря убрали, без неё ошибка всё-равно будет генерироваться.

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


  • 8 months later...

Для сброса всего SQL кэша можно поместить текущее время time() в кэшь с ключем "sql_globalresetcache".

Подскажите как это правильно сделать? Что и куда дописать?

Нужно, чтобы все файлы кеша, которые начинаются на "cache.sql_", удалялись через определенный промежуток времени.

Либо же, что еще лучше - при достижении количества в 1000 файлов, начинающихся на "cache.sql_"

Как это сделать?

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


  • 1 month later...
  • 3 months later...

Notice: Use of undefined constant CACHE_DRIVER - assumed 'CACHE_DRIVER' in /var/www/system/library/cache.php on line 10Notice: Use of undefined constant CACHE_DRIVER - assumed 'CACHE_DRIVER' in /var/www/system/library/cache.php on line 39Notice: Use of undefined constant CACHE_DRIVER - assumed 'CACHE_DRIVER' in /var/www/system/library/cache.php on line 39

Странно почему то не сработало...

Кстати нет ли возможности сделать еще один вид кеширования для APC у меня почему то оно не сработало


public function get($key) {
		    if (extension_loaded('apc')) {
				    return apc_fetch(HTTP_SERVER.$key);
		    }
    else {
    // old get code goes here
    }
    }[/b]
[b]    public function set($key, $value) {
		    if (extension_loaded('apc')) {
				    apc_store(HTTP_SERVER.$key,$value,600);
		    }
    else {
    // old set code goes here
    }
    }[/b]
[b]    public function delete($key) {
	  if (extension_loaded('apc')) {
				    apc_delete(HTTP_SERVER.$key);
		    }
    else {
    // old delete code goes here
    }
    }[/b]
[b]
Надіслати
Поділитися на інших сайтах


  • 9 months later...
  • 3 months later...

Установка mysql_cached вред здоровью сайта. Не устанавливать никому, пока не исправят ошибок.

Работает совершенно не правильно и при большом количестве товаров наоборот сильно тормозит сайт

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

Да, только что снес его у клиента, тормозил очень сильно.

После сноса - сайт начал функционировать отлично.

Дело в том, что когда много запросов, то в кеше собирается более 100`000 файлов, и тогда уже начинает тормозить файловая система сервера (причем конкретно) :) Надо запросы кеша обьединить в один файл массив кеш запросов, по каким-то признакам. Далее, при включенном драйвере кеша, иногда не получается в админ части даже удалить модуль, через раз. Т.е. надо зайти очистить кеш а только потом удалять, но это еще не все. Все равно имеет место неправильное кеширование, из-за чего например параметры settings не удаляются и т п

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

markimax, если товаров много, это понятно ФС начинает тупить, а если прикрутить memcache ?

или если использовать когда товаров не так много? ведь по сути результат любого запроса читается, даже с диска за тысячные секунды

 

в своё время так же отключал этот скрипт из-за тормозов ФС на большой базе.

Змінено користувачем freelancer
Надіслати
Поділитися на інших сайтах

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

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

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

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

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

Вхід

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

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

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

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

Important Information

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