Кэш для WordPress на System Sharedmemory

Столкнулся с проблемой - сайт начал сильно тормозить, пришлось искать способы увеличь производительность. Первое средство от тормозов это поставить кеш плагин ну и здесь мимо WP Super Cache никак не пройдеш. Идея в нем конечно заложена хорошая вот только разработчики не предусмотрели возможность контролировать размер кэш и плагинчик за 3 дня наколбасил столько статических страниц, что занял почти все свободное место на диске. А вот настроить стандартный метод кеширования в этом плагине у меня так и не получилось.
Хорошо себя показал плагин . В нем все данные сохраняются одним файлом и во время старта весь файл загружается в память WP рабоет очень быстро, но! опять таки размер кеш никак не контролируется, и самое главное просроченных данные (expire) не удаляются, поэтому размер файла будет постоянно расти пока PHP ним не подавится.
Еще несколько плагинов кеширующих данные в файлы дали жуткие тормоза порядка 15-20 сек при том что без кеширования время генерации главной страницы было 7-8 сек.

И так кеш в WP подклюячается простым способом вы должны положить в директорию /wp-content файлик object-cache.php, в нем должны быть описаны соответствующие функции, wordpress обнаружив этот файл подключает его, в противном случае подключается стандартный кеш /wp-inludes/cache.php Обращаю ваше внимание на то, что механизм кеширования будет работать в любом случае и вы можете пользоваться ним для сохранения данных на время работы скрипта, это если у вас стандартный кеш, а вот задача сторонних плагинов сохранить эти данные до следующего запроса (сессии).
Вообще надо сказать кэш в WP - самое горячее место, если запустить статистику то мы увидим: количество обращений в кеш в среднем от 500 - 1500 запросов, готов поспорить, что функция wp_cache_get - самая востребованая в WordPress, поэтому здесь разработчикам надо быть предельно внимательным и тщательно оптимизировать по времени все cache функции.
Собственно почему я взялся писать свой вариант cache - у меня возникла идея сохранять его в оперативной памяти и вот тут я наткнулся на pear библиотеку
Библиотека поддерживает следующие модули:

  • eAccelerator []
  • Turck MMCache []
  • APC []
  • Shmop []
  • Apache Notes []
  • Memcached []
  • System V (имена переменных до 4х символов) []
  • SQLite (база данных создаётся в памяти) []
  • Sharedance []
  • File (данные хранятся в файлах)

Алгоритм следующий - все данные сохраняются одним блоком в объекте класса SMCache, в конце работы скрипта он передается драйверу, под драйвером я тут понимаю объект класса System_SharedMemory, далее он уже решает как сохранять данные например подвергать их сериализации или нет, тут все зависит от того, какой носитель вы будете использовать. Точно также данные и считываются - одним блоком. Если кто то думает, что это не правильно и данные надо подгружать по мере их востребования - отвечу, что это не так. На самом деле это уже второй вариант моего cache плагина первая модель работала именно по такому принципу но тесты показали, что одним куском гораздо быстрее. Кроме того сложность и объем php кода самого cache намного увеличивается, а я уже говорил, что это очень горячее место и здесь каждая строка на счету. Единственный большой недостаток это, что размер такого кеш жестко ограничен лемитом памяти для php скриптов, однако можете смело рассчитывать на 4 Мг, что среднего блога хватит с головой. Теперь остается только научит cache не жадничать и укладываться в выделенный ему размер памяти. Для этого я завел несколько массивов где записывается статистика на каждый блок данных проходящих через кеш здесь фиксируется: кол-во чтений, кол-во записей, время жизни, время последнего изменения, размер данного блока вот тут, кстати, надо сказать размер измеряется с помощью strlen(serialize($data)) кроме этого больше ничего не нашол :(
Далее если общий размер превысил допустимы расчитываем для каждого блока данных коэфициент полезности по следующей формуле
ar_pr = ar_num_ses_rd/(1+num_ses - ar_ses_add)
где
ar_num_ses_rd - счетчик, если данные были востребованы из кеш (!не важно сколько раз 1 или 200) то прибавляем 1
num_ses номер сессии - глобальный счетчик класса
ar_ses_add номер сессии когда блок данных был впервые добавлен в кеш
Итак чем чаще запрашиваются данные по сессиям тем ближе коэффициент к 1.
Ну а теперь удаляем самые бесполезные данные пока кеш не достигнет нужного размера.

smcache
установка:
распаковать архив в /wp-content
открыть file object-cache.php и установить переменную $sm_type_cache = ‘File’; тут надо выбрать тип драйвера думаю можно его так назватьна данный момент мной опробованы File и Shmop
Установить другие настройки там вроде все понятно
Если кто-то сможет подключить остальные классы System_SharedMemory не жадничайте поделитесь кодом. :)

Рубрика: PHP, WordPress, разное марта 9, 2009.

Leave a Reply

Разработки

Ссылки

Счетчики

Реклама