Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

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


UncleAndy
 Поделиться

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

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

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

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

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

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

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

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


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

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


  • 2 месяца спустя...

версия 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 месяцев спустя...

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

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

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

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

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

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


  • 1 месяц спустя...
  • 3 месяца спустя...

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 месяцев спустя...
  • 3 месяца спустя...

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

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

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

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

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

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

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

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

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

 

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

Изменено пользователем freelancer
Ссылка на комментарий
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.