UncleAndy

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

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

UncleAndy    16

Сделал две модификации для улучшения кэширования через 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

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


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

во класс. теперь можно все на отдельных серверах крутить.

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


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

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

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


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

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

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

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

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

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

define('DB_DRIVER', 'mysql_cached');

define('DB_CACHED_EXPIRE', 120);

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

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


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

А можно для тех, кто не понимает с полуслова, написать в двух словах инструкцию, как сие чудо приспособить к скрипту?

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


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

Для драйвера БД 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 будут пользоваться разные магазины - для разделения их кэшей.

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


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

Добавил описание установки на страницы модулей.

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


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

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

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

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

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

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

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


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

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

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


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

версия 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

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

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


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

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

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

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

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

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


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

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


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

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); 
        }

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


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

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

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


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); 
		}
    	}
  	}


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

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


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

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

Можно подробнее - где именно?

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


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

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

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

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

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


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

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

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

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

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

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

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


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

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]

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


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

Народ так что стоит не стоит танцы с бубнами проводить и ставить memcashe?

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


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

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

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

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


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

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

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

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

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


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

Не знаю насчет mysql_cached, но memcache прекрасно работает и заметно ускоряет работу сайта

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


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

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

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

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

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

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

Войти

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

Войти


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

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