Memcached wordpress


Memcached является одним из самых быстрых и популярных средств для кэширования произвольных данных в оперативной памяти. В этой статье мы рассмотрим установку и настройку сервера Memcached для кэширования объектов в WordPress.

Грамотное кэширование в WordPress позволяет ускорить работу сайта, снизить нагрузку и потребление ресурсов хостинг-площадки, что особенно важно если речь идет о крупных высоко-посещаемых проектах.

Если вам не знаком термин «кэширование» советуем сперва прочитать нашу статью, где мы рассматриваем самые основы всех видов кэширования в WordPress. В статье про кэширование объектов вы узнаете подробнее о классе WP_Object_Cache и о его важной роли в ядре WordPress.

А еще, я хочу порекомендовать Вам услуги профессионалов в создании и оптимизации сайтов: http://webkitchen.kiev.ua/

Memcached

MemcachedMemcached — это сервер, который позволяет быстро и эффективно сохранять данные в память с определенным ключом, с помощью которого эти данные можно так же быстро получить.


В силу своей простоты Memcached работает гораздо быстрее чем MySQL, и потребляет гораздо меньше памяти. Есть и ограничения связанные с этой простотой, например нельзя отправлять сложные запросы на выборку, поэтому полностью заменить базу данных сервером Memcached в WordPress невозможно.

Кэширование объектов в WordPress работает по тому же принципу, что и Memcached — произвольные значения или объекты хранятся в памяти под определенным ключом. Недостаток один — поскольку кэш объектов в WordPress является непостоянным, все закэшированные значения сбрасываются при следующем посещении страницы сайта.

Сервер Memcached помогает решить эту проблему и сделать объектный кэш постоянным. Это значит, что такие данные как опции сайта WordPress, пользователи, термины, записи, мета-данные и прочее, можно сразу получать из хранилища Memcached в обход базы данных MySQL.

Установка Memcached

Для того, чтобы установить сервер Memcached вам потребуется доступ администратора к вашей хостинг-площадки. Большинство провайдеров виртуального хостинга не предоставляют такой возможности, поэтому следует смотреть в сторону виртуальных (VPS) или выделенных (dedicated) серверов. Учтите так же, что на некоторых специализированных хостинг-площадках уже установлен и настроен сервер Memcached, например WP Engine.

Установить сервер Memcached легко с помощью менеджера пакетов в том или ином дистрибутиве Linux. Например в Ubuntu или Debian Linux сделать это можно с помощью утилиты apt-get:

sudo apt-get install memcached  

После установки сервер Memcached запустится сразу. Конфигурация сервера находится в файле /etc/memcached.conf, где вы можете настраивать такие параметры как память, адрес и порт. Эти данные вам потребуются при конфигурации плагина для WordPress.

После внесения изменений в конфигурационный файл не забудьте перезагрузить сервер:

sudo service memcached restart

Учтите, что перезагрузка сервера удаляет все закэшированные данные, поэтому перезагрузка на живом сайте может вызвать дополнительную нагрузку на хостинг-сервер и крайне не рекомендуется.

Memcached в WordPress

Memcached Object Cache является самым популярным и надежным плагином для кэширования объектов на сервере Memcached. Он написан Райаном Борэном, одним из ведущих разработчиков ядра WordPress.

wordpress-memcached

Для работы данного плагина вам потребуется расширение memcache для PHP, которое можно найти в официальном репозитории PECL. Установить данное расширение можно с помощью команды pecl на вашем сервере:

sudo pecl install memcache  

После установки расширения (если pecl не сделает это за вас) вам необходимо будет перезагрузить PHP, чтобы интерпретатор подключил новый модуль.

Установка плагина Memcached Object Cache отличается от установки других — вам не следует размещать плагин в директории wp-content/plugins, поскольку Memcached Object Cache является не типичным плагином, а так называемым дроп-ином (или вкраплением), который выполняется на самом раннем этапе загрузки ядра WordPress, и который не возможно отключить через панель администрирования.

Дроп-ины (или вкрапления) в WordPress

Файл object-cache.php из архива плагина следует разместить в директории wp-content, после чего плагин автоматически становится активным.

Если на данном этапе при посещении вашего сайта вы увидели «белый экран смерти», то причин может быть несколько:

Не установлен модуль memcache для PHP
Не запущен сервер Memcached
Нет доступа к серверу, например он сконфигурирован на другой порт

Конфигурация плагина

Интерфейса для конфигурации плагина Memcached Object Cache нет. Вся конфигурация происходит с помощью PHP файла, например wp-config.php:

define( 'WP_CACHE_KEY_SALT', '' );
$memcached_servers = array( '127.0.0.1:11211' );

Первая директива определяет префикс всех сохраняемых ключей на сервере. Важно установить уникальный префикс, если сервер обслуживает более одного сайта на WordPress, иначе может возникнуть конфликт ключей.


Глобальный массив $memcached_servers содержит адреса и порты всех серверов Memcached. Если вы используете стандартную конфигурацию, то вероятнее всего данный массив вам объявлять не нужно.

Чтобы отключить кэширование объектов в Memcached достаточно удалить или переименовать файл object-cache.php в директории wp-content. Учтите, что это не удалит данные на сервере. Если вы хотите удалить все данные с сервера, его необходимо перезагрузить или отправить команду flush_all.

Плагин Memcached Redux является альтернативой плагину Memcached Object Cache. Он использует класс Memcached и расширение для PHP memcached (а не memcache), которое так же можно установить из репозитория PECL.

Статистика Memcached

К серверу Memcached можно подключиться с помощью утилиты telnet и посмотреть статистику с помощью команды stats:

telnet 127.0.0.1 11211
stats
STAT pid 7794
STAT uptime 3084
STAT time 1395221340
STAT version 1.4.13
...

Данная статистика позволит вам узнать эффективность кэширования объектов и потребляемую память. Самыми важными значениями здесь являются get_hits и get_misses которые означают наличие или отсутствие объекта в кэше при запросе. Если значение get_misses не намного меньше чем get_hits, то возможно вам необходимо увеличить выделяемую память серверу Memcached.



Важно отметить, что самой надежной защитой сервера Memcached является ограничение доступа к нему по IP адресу на уровне системы. На самом сервере Memcached защита от злоумышленников не предусмотрено, разве что аутентификация с помощью SASL в более новых версиях сервера.

Это значит, что Memcached следует использовать только в закрытых и защищенных сетях.

В Memcached так же нет пользователей и привилегий, поэтому если вы используете один сервер для двух разных сайтов, один сайт может легко получить доступ к данным другого сайта, независимо от уникальных префиксов.

info-business.pro

Подключение услуги Memcached

Для подключения персонального memcached нужно в панели управления хостингом перейти в раздел «Услуги» — «Memcached».

Далее, выбираете объем, и нажимаете кнопку «Выбрать».

Выбор тарифа

После настройки Memcached на сайте в этом разделе вы будете видеть потребление оперативной памяти и график нагрузки. Эти данные помогут вам понять, хватает ли вам объёма, выбранной оперативной памяти.

Из панели управления хостингом не выходите, вам ещё понадобится файловый менеджер.

Установка плагина на сайте и настройка Memcached


Открываем административную панель сайта, переходим в раздел «Плагины» — «Добавить новый».

Добавление плагина

В поле поиска введите название плагина WP-FFPC, система найдёт плагин, жмите кнопку «Установить».

Установка плагина

Установив плагин, активируем его нажатием на кнопку «Активировать».

Далее, переходим в раздел «Настройки» — «WP-FFPC», и в первом разделе «Cache type» нужно выбрать тип кеша PHP memcache.

Выбор типа кеша


Обратите внимание, именно «PHP memcache», без «d». Затем нажимаем «Save Changes» для сохранения настроек плагина.

После чего в верхней части экрана вы увидите информацию о сохранении настроек и предупреждение о том, что для завершения настройки нужно внести изменения в файл wp-config.php.

Предупреждение от плагина

Сделать это можно через ftp-соединение или через файловый менеджер хостинга. Так как у вас открыта панель хостинга, открываете «Файловый менеджер», выбираете папку с нужным сайтом, где открываете для редактирования файл wp-config.php (через контекстное меню правой кнопки мыши).

Редактирование файла конфигурации

И сразу после открытия PHP можно вставить код, который предлагал плагин в предупредительном сообщении:

define( 'WP_CACHE', true );


Вставка кодаСохраняете изменения в файле и обновляете страницу плагина на сайте. Предупредительное сообщение должно исчезнуть.

Плагин имеет ряд вкладок и настроек, предустановленных по умолчанию. Вы можете ознакомиться с ними, и изменить при необходимости. Я заметил, что зачастую для разных сайтов базовые настройки работают лучше всего.

Заключение

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

Ещё вы должны понимать, что на кеширование потребуется некоторое время. И то, что в сервисах проверки скорости останутся проблемные моменты, связанные с внешними источниками.

Проблемные моменты


Эти проблемы можно попробовать решить предварительной загрузкой, но не для всех источников работает это решение.

Теперь вы знаете про инструмент, который есть у каждого хостинг-провайдера, и который вы можете использовать для ускорения свих сайтов. Услуга платная, но её можно включать и отключать, когда вам захочется. Можете включить на денёк и протестировать скорость загрузки.

Друзья, желаю вам удачи!

С уважением, Максим Зайцев


    Похожие статьи по теме:

  • Важные секреты успешной раскрутки сайта в поисковиках
  • Сокращение времени загрузки блога в 10 раз и мой эксперимент
  • Как вставить код в статью без плагина
  • Как создать CSS спрайт для сайта
  • Оптимизация изображения для увеличения скорости загрузки сайта

1zaicev.ru

Установка Memcached

На нашем сервере используется Plesk с CentOS 7.x. Тем не менее, это руководство применимо и к другим системам, однако при выполнении следующих операций нужно использовать утилиты, специфичные для определённых систем (например, apt-get вместо yum). Для того чтобы установить Memcached, в первую очередь следует подключиться к серверу по SSH и использовать командную строку:


# yum install memcached

После завершения установки вводим следующую команду:

# service memcached start

Далее следует установить PECL-версию Memcached для нужной версии PHP. WordPress полностью совместим с PHP 7, поэтому давайте активируем Memcached для последней версии PHP — 7.1. Начнём с установки всех необходимых пакетов для добавления их к нашему кастомному PHP-модую в Plesk:

# yum install make plesk-php71-devel gcc glibc-devel libmemcached-devel zlib-devel

Соберите модуль, следуя этим инструкциям. Вы можете не указывать директорию Memcached вручную, просто нажмите Ввод при запросе:

/opt/plesk/php/7.1/bin/pecl install memcached

Следующим шагом станет добавление строчки к соответствующему конфигурационному файлу, чтобы зарегистрировать модуль в PHP. Вы можете использовать командную строку, не открывая самого файла в редакторе:

# echo "extension=memcached.so" > /opt/plesk/php/7.1/etc/php.d/memcached.ini

И наконец, перечитайте обработчики PHP, чтобы модуль отобразился в информации о PHP в графическом меню Plesk.

# plesk bin php_handler —reread

Теперь Вы можете вызвать страницу phpinfo(), чтобы проверить корректную загрузку модуля Memcached:

zhalko.jpg
Информация о memcached в phpinfo()

Либо используйте командную строку:

zhalko.jpg
Проверка работы memcached в командной строке

# /opt/plesk/php/7.1/bin/php -i | grep "memcached support"

Защитите и контролируйте ваш Memcached

Memcached по умолчанию использует порт 12211.Из соображений безопасности можно перенаправить данный порт на локальную машину.
Добавьте следующую строку в конец файла /etc/sysconfig/memcached и перезагрузите службу Memcached:

OPTIONS="-l 127.0.0.1"

Для мониторинга и получения статистики от Memcached используйте следующие команды:

echo "stats settings" | nc localhost 11211
/usr/bin/memcached-tool localhost:11211

Активируйте Memcached в WordPress

Как только Memcached установлен на сервер, он доступен для активации в WordPress. В первую очередь нужно активировать бэкенд Memcached специальным скриптом, который автоматически определяет, использовать ли Memcached в качестве кэширующего механизма.

Скачайте скрипт с https://github.com/bonny/memcachy и переносите все файлы в директорию /wp-content/.

Если Вы не меняли порт Memcached по умолчанию (11211), Вы можете использовать его напрямую. Если вы изменили его, то в файл wp-config.php, лежащий в корневой директории вашей установки WordPress, следует добавить следующий код:

$memcached_servers = array( array( ‘127.0.0.1’, 11211 ) );

Теперь, когда активирован бэкенд, мы установим кэширующий плагин для сохранения и предоставления обработанных страниц через Memcached. Установите плагин Batcache (https://WordPress.org/plugins/batcache/) используя инструкцию по установке:

  1. скачайте и разархивируйте архив;
  2. загрузите файл advancaed-cache.php в директорию /wp-content/;
  3. откройте wp-config.php и добавьте следующую строку:
  4. define(‘WP_CACHE’, true);

    Важно: убедитесь, что Memcached для выбранной версии PHP включён корректно, иначе добавление этой строки вызовет ошибку!

  5. загрузите batcache.php в директорию /wp-content/plugins.

Вот и всё! Теперь можете открыть advanced-cache.php и отрегулировать настройки по вашему усмотрению. Файл batcache.php — это небольшой плагин, который регенерирует кэш на статьях и страницах. Не забудьте активировать плагин в бэкенде на странице плагина!

Проверьте правильность работы Memcached в WordPress

Теперь давайте убедимся, что все действия были выполнены как нужно. Самым простым способом подтвердить то, что генерируемая страница выдаётся из кэша, станет добавление дополнительного поля заголовка к ответу.

Чтобы это сделать, нужно изменить файл advanced-cache.php. Откройте его и найдите строку

var $headers = array();

Замените её на:

var $headers = array(‘memcached’ => ‘activated’);

Откройте инструменты разработчика в своём браузере (F12 для Crhome), выберите вкладку «Network» и перезагрузите страницу несколько раз, чтобы быть уверенным, что страница грузится из кэша, и проверьте ответные заголовки. Если вы видите поле memcached — у уас всё получилось!

zhalko.jpg
Memcached – проверка ответных заголовков

Memcached – проверка ответных заголовков

Обратите внимание, если вы вошли (залогинились) в административную панель сайта на WordPress, кэширование не будет задействовано и система всегда будет отдавать незакэшированную версию страницы. Каким образом проверить функциональность кэша в этом случае? Разлогиньтесь или откройте новую вкладку браузера в режиме «Инкогнито» и используйте инструменты разработчика в браузере.

Вместо изучения заголовков можно проверить исходный код загружаемой страницы. На то, что страница была загружена из кэша, указывают следующие строки:

zhalko.jpg
Исходный код загружаемой страницы

Проведём стресс-тест вместе с Blitz.io

Мы можем провести нагрузочное тестирование с помощью стресс-теста, симулирующего множество одновременных посещений ресурса на протяжении определённого времени. Если ваш сервер не защищён от повышенной нагрузки, он начнёт отвечать медленнее до тех пор, пока не сможет больше обрабатывать запросы. Если Memcached активирован, сервер продержится дольше и не будет выдавать ошибок.

Давайте запустим некоторые тесты на загрузку и производительность с помощью сервиса Blitz.io.
Отметим: для этого стресс-теста использован небольшой сервер с одним CPU и 500Мб памяти.

zhalko.jpg
Стресс-тест без использования Memcached

Результат БЕЗ использования Memcached:

Результат такой же, как у стресс-теста Varnish. Как видите, пришлось прекратить стресс-тест, так как сервер не смог обрабатывать запросы быстрее 5 секунд при 50 одновременных подключённых пользователях. Всего лишь через 15 секунд сервер полностью перестал отвечать на запросы.

zhalko.jpg
Стресс-тест WordPress и включённый Memcached

Как видите, Memcached позволяет сохранять стабильность работы сервера даже под высокой нагрузкой. Маленький тестовый сервер выдержал болше 400 одновременных запросов и дольше 50 секунд без каких-либо ошибок. После 50 секунд и почти 450 одновременных пользователей сервер всё-таки перестал принимать дальнейшие запросы. На более мощной конфигурации эти цифры были бы значительно выше.

Таким образом, использование Memcached — отличная идея для тех, кто хочет большей устойчивости к нагрузке. При помощи этой системы даже можно обезопасить сайт от небольших атак. Для защиты сервера от настоящей ДдоС-атаки (Distributed Denial of Service — атака на отказ в обслуживании) следует использовать сервис CloudFlare, Куратор или аналогичные системы фильтрации.

Заключение: WordPress отлично работает с Memcached

Memcached может значительно улучшить производительность сайта на WordPress и снизить нагрузку на CPU вашего сервера. Он прост в установке и работает «из коробки».

Перевод: Антон Ларгин (Русоникс)
Оригинал: plesk.com

  • Поделиться:

www.rusonyx.ru

Требования

На момент написания этой статьи, последняя стабильная версия WordPress 4.8 и требует:

  • PHP > = 5.2.4. Кроме того, использование Memcached настоятельно рекомендуется для лучшей работы сайта;
  • Веб – сервер Nginx или Apache;
  • MySQL или MariaDB установленной на вашем Linux VPS.

Обновление системы

Убедитесь, что ваш список пакетов и пакеты ОС обновлены, выполнив следующие команды:

sudo apt-get update sudo apt-get upgrade

 

Кроме того, можно настроить автоматическое обновление.

Установка Nginx

Чтобы установить последнюю версию Nginx из официального репозитория Nginx, отредактируйте файл «/etc/apt/sources.list»:

sudo vi /etc/apt/sources.list

 

Добавьте следующие строки:

deb http://nginx.org/packages/ubuntu/ xenial nginx deb-src http://nginx.org/packages/ubuntu/ xenial nginx 

Установите MySQL

sudo apt-get install mysql-server

 

Остановите и удалите службу Apache, а затем установите Nginx на виртуальный сервер с помощью следующих команд:

sudo service apache2 stop sudo apt-get remove apache2 sudo apt-get autoremove sudo apt-get install nginx

 

Настройка Nginx для запуска при загрузке:

sudo update-rc.d -f nginx defaults

Установка Memcached, PHP 7 и модулей PHP:

sudo apt-get install memcached php-memcache php-memcached php7.0 php7.0-cli php7.0-fpm php7.0-curl php7.0-mbstring php7.0-mysql php7.0-gd php7.0-zip php7.0-intl php7.0-mcrypt libgd-tools libmcrypt-dev mcrypt php-pear libgd-dev php-pear php7.0-dev

Запустите процедуру установки WordPress

Загрузите последнюю версию WordPress, имеющуюся на официальном сайте в каталоге вашего виртуального сервера, а затем извлеките ее, используя следующие команды:

sudo apt-get install wget unzip cd /opt/ wget https://wordpress.org/latest.zip unzip latest.zip mv /opt/wordpress/ /var/www/html/wordpress/ 

 

WordPress требует для своей работы базу данных, где сохраняются данные, таким образом, создайте новую базу данных MySQL:

mysql -u root -p mysql> create database wpdb; mysql> GRANT ALL PRIVILEGES ON wpdb.* TO 'wpuser'@'localhost' IDENTIFIED BY 'Y0Ur_Pa5sw0rD'; mysql> flush privileges; mysql> quit

 

Добавьте имя пользователя, пароль и имя базы данных MySQL для файла конфигурации WordPress:

mv /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php
vi /var/www/html/wordpress/wp-config.php
define('DB_NAME', 'wpdb');  define('DB_USER', 'wpuser');  define('DB_PASSWORD', 'Y0Ur_Pa5sw0rD');

 

Создайте новый файл конфигурации Nginx и добавьте следующий виртуальный блок для вашего доменного имени:

vi /etc/nginx/sites-available/your-domain.ru.conf

 

Добавьте следующие строки:

server { listen 80; server_name your-domain.ru; root /var/www/html/wordpress/; index index.php; access_log /var/log/nginx/your-domain.ru-access.log; error_log /var/log/nginx/your-domain.ru-error.log; charset en_us.UTF-8;  location / {   try_files $uri $uri/ /index.php?$args; }  location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {  expires 365d;  }location ~* .(pdf)$ {  expires 30d; }  location ~ .php$ {  fastcgi_pass 127.0.0.1:9000;  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  include fastcgi_params; } }

 

Не забудьте заменить «your-domain.ru» на действительное имя домена. Затем отключите файл конфигурации Nginx «по умолчанию»:

rm /etc/nginx/sites-enabled/default

 

Включить новый конфигурационный файл Nginx:

ln -sf /etc/nginx/sites-available/your-domain.ru.conf /etc/nginx/sites-enabled/

 

Откройте файл «/etc/php/7.0/fpm/pool.d/www.conf» и измените переменную ‘listen’:

listen = /run/php/php7.0-fpm.sock

на:

listen = 127.0.0.1:9000;

 

Найдите файл конфигурации PHP:

# php -i | grep -i php.ini Configuration File (php.ini) Path => /etc/php/7.0/cli Loaded Configuration File => /etc/php/7.0/cli/php.ini

 

Отредактируйте файл конфигурации «/etc/php/7.0/cli/php.ini»:

vi /etc/php/7.0/cli/php.ini

Добавьте/измените следующие параметры:

max_execution_time = 300 max_input_time = 600 memory_limit = 256M post_max_size = 64M upload_max_filesize = 64M

Отредактируйте файл конфигурации «memcache.ini»:

vi /etc/php/7.0/mods-available/memcache.ini

 

добавьте следующие строки в конце:

session.save_handler = memcache session.save_path = "tcp://localhost:11211"

 

Отредактируйте файл /etc/memcached.conf и увеличьте объем памяти Memcached до 128 МБ или выше:

-m 64

на:

-m 128

Пользователь веб-сервера (www-data) необходимо, чтобы иметь возможность записывать файлы и каталоги внутри каталога ‘/var/www/html/wordpress’, выполнив следующую команду:

sudo chown www-data:www-data -R /var/www/html/wordpress/

 

Отредактируйте конфигурационный файл Nginx (/etc/nginx/nginx.conf) и добавьте «gzip_vary на» в блок «HTTP»:

vi /etc/nginx/nginx.conf  gzip_vary on

 

Проверьте конфигурацию Nginx:

# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

 

Если проверка прошла успешно, перезапустите Memcached, php7.0-FPM и услуги Nginx для того, чтобы изменения вступили в силу:

sudo service memcached restart sudo service php7.0-fpm restart sudo service nginx restart

 

Откройте http://your-domain.ru/ используя ваш любимый веб-браузер и следуйте простым инструкциям. После установки, войдите в панель администратора и настройте в соответствии с вашими потребностями.

Установка и настройка W3 Total Cache использовать Memcached

Откройте http://your-domian.ru/wp-admin/plugins.php >> Add New >> Search for ‘W3 Total Cache’ >> и нажмите кнопку ‘Установить сейчас’ рядом с названием ‘W3 Total Cache’ >>  и Activate.

Откройте http://your-domian.ru/wp-admin/plugins.php >> нажмите «Настройки» в разделе W3 Total Cache:

  • Minify
Minify: select 'Enable' Minify Cache Method: Memcached

 

Нажмите кнопку “Сохранить все настройки”.

  • Cache Object
Object Cache: select 'Enable'  Object Cache Method : Memcached

 

Нажмите кнопку “Сохранить все настройки”.

Все. Установка WordPress с Memcached и Nginx завершена.

andreyex.ru

APCu> Memecachedd при кешировании только на одном сервере. Memcached следует использовать для кэширования объектов в среде с несколькими серверами, в то время как на одном сервере накладные расходы на связь и переключение задач, связанных с использованием, просто бессмысленны по сравнению с не сложным прямым подходом к памяти, который занимает APCu.

Что касается времени истечения срока хранения кэшированной записи, это то, что установлено на стороне wordpress. У W3TC есть опция конфигурации, и если вы используете API-интерфейс wordpress caching, вы можете настроить истечение самостоятельно. Конечно, время истечения срока действия не означает, что средство кэширования фактически сохранит его так долго, и из вашего описания это похоже на то, что ваши записи очищаются до истечения таймаута, и это может указывать на то, что у вас недостаточно памяти для кеша или что у вас нет последовательного способа вычисления ключей кеша.

Обе утилит кэширования имеют свои собственные утилиты мониторинга, которые не являются сложными и не дают большого понимания, но мой опыт в том, что, если вам нужно проверять вещи на этом уровне, вы, вероятно, не используете достаточную кэш-память.

И обсуждение всего связанного с кэшированием объекта бессмысленно, если вы W3TC работаете правильно, так как должно быть очень мало ударов по APCu / memcached или БД.

www.wordpressask.com

Memcached

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

В силу своей простоты Memcached работает гораздо быстрее чем MySQL, и потребляет гораздо меньше памяти. Есть и ограничения связанные с этой простотой, например нельзя отправлять сложные запросы на выборку, поэтому полностью заменить базу данных сервером Memcached в WordPress невозможно.

Кэширование объектов в WordPress работает по тому же принципу, что и Memcached — произвольные значения или объекты хранятся в памяти под определенным ключом. Недостаток один — поскольку кэш объектов в WordPress является непостоянным, все закэшированные значения сбрасываются при следующем посещении страницы сайта.

Сервер Memcached помогает решить эту проблему и сделать объектный кэш постоянным. Это значит, что такие данные как опции сайта WordPress, пользователи, термины, записи, мета-данные и прочее, можно сразу получать из хранилища Memcached в обход базы данных MySQL.

Установка Memcached

Для того, чтобы установить сервер Memcached вам потребуется доступ администратора к вашей хостинг-площадки. Большинство провайдеров виртуального хостинга не предоставляют такой возможности, поэтому следует смотреть в сторону виртуальных (VPS) или выделенных (dedicated) серверов. Учтите так же, что на некоторых специализированных хостинг-площадках уже установлен и настроен сервер Memcached, например WP Engine.

Установить сервер Memcached легко с помощью менеджера пакетов в том или ином дистрибутиве Linux. Например в Ubuntu или Debian Linux сделать это можно с помощью утилиты apt-get:

sudo apt-get install memcached  

После установки сервер Memcached запустится сразу. Конфигурация сервера находится в файле /etc/memcached.conf, где вы можете настраивать такие параметры как память, адрес и порт. Эти данные вам потребуются при конфигурации плагина для WordPress.

После внесения изменений в конфигурационный файл не забудьте перезагрузить сервер:

sudo service memcached restart

Учтите, что перезагрузка сервера удаляет все закэшированные данные, поэтому перезагрузка на живом сайте может вызвать дополнительную нагрузку на хостинг-сервер и крайне не рекомендуется.

Memcached в WordPress

Memcached Object Cache является самым популярным и надежным плагином для кэширования объектов на сервере Memcached. Он написан Райаном Борэном, одним из ведущих разработчиков ядра WordPress.

Для работы данного плагина вам потребуется расширение memcache для PHP, которое можно найти в официальном репозитории PECL. Установить данное расширение можно с помощью команды pecl на вашем сервере:

sudo pecl install memcache

После установки расширения (если pecl не сделает это за вас) вам необходимо будет перезагрузить PHP, чтобы интерпретатор подключил новый модуль.

Установка плагина Memcached Object Cache отличается от установки других — вам не следует размещать плагин в директории wp-content/plugins, поскольку Memcached Object Cache является не типичным плагином, а так называемым дроп-ином (или вкраплением), который выполняется на самом раннем этапе загрузки ядра WordPress, и который не возможно отключить через панель администрирования.

Файл object-cache.php из архива плагина следует разместить в директории wp-content, после чего плагин автоматически становится активным.

Если на данном этапе при посещении вашего сайта вы увидели «белый экран смерти», то причин может быть несколько:

  • Не установлен модуль memcache для PHP
  • Не запущен сервер Memcached
  • Нет доступа к серверу, например он сконфигурирован на другой порт

Конфигурация плагина

Интерфейса для конфигурации плагина Memcached Object Cache нет. Вся конфигурация происходит с помощью PHP файла, например wp-config.php:

define( 'WP_CACHE_KEY_SALT', '' );  $memcached_servers = array( '127.0.0.1:11211' );  

Первая директива определяет префикс всех сохраняемых ключей на сервере. Важно установить уникальный префикс, если сервер обслуживает более одного сайта на WordPress, иначе может возникнуть конфликт ключей.

Глобальный массив $memcached_servers содержит адреса и порты всех серверов Memcached. Если вы используете стандартную конфигурацию, то вероятнее всего данный массив вам объявлять не нужно.

Чтобы отключить кэширование объектов в Memcached достаточно удалить или переименовать файл object-cache.php в директории wp-content. Учтите, что это не удалит данные на сервере. Если вы хотите удалить все данные с сервера, его необходимо перезагрузить или отправить команду flush_all.

Плагин Memcached Redux является альтернативой плагину Memcached Object Cache. Он использует класс Memcached и расширение для PHP memcached (а не memcache), которое так же можно установить из репозитория PECL.

Статистика Memcached

К серверу Memcached можно подключиться с помощью утилиты telnet и посмотреть статистику с помощью команды stats:

telnet 127.0.0.1 11211  stats  STAT pid 7794  STAT uptime 3084  STAT time 1395221340  STAT version 1.4.13  ...  

Данная статистика позволит вам узнать эффективность кэширования объектов и потребляемую память. Самыми важными значениями здесь являются get_hits и get_misses которые означают наличие или отсутствие объекта в кэше при запросе. Если значение get_misses не намного меньше чем get_hits, то возможно вам необходимо увеличить выделяемую память серверу Memcached.

Статистику использования кэша объектов в WordPress можно посмотреть с помощью плагина Debug Bar, а если вы предпочитаете графическое представление статистики Memcached, вы можете попробовать скрипт memcache.php.

Безопасность

Важно отметить, что самой надежной защитой сервера Memcached является ограничение доступа к нему по IP адресу на уровне системы. На самом сервере Memcached защита от злоумышленников не предусмотрено, разве что аутентификация с помощью SASL в более новых версиях сервера.

Это значит, что Memcached следует использовать только в закрытых и защищенных сетях.

В Memcached так же нет пользователей и привилегий, поэтому если вы используете один сервер для двух разных сайтов, один сайт может легко получить доступ к данным другого сайта, независимо от уникальных префиксов.

wpmag.ru

Memcached

Memcached is a distributed in-memory caching system that stores key-value pairs in RAM. That will make sense to a lot of people, if it doesn’t to you – check this out:

// hey - connect me to the server where I store stuff! connection = connect_to_server();  // store this value in that RAM of yours // "key" holds "value" connection.set( key, value );  // give me that value I stored with "key" connection.get( key );

It was originally developed by Brad Fitzpatrick for LiveJournal. The concept is simple: instead of running 18 web servers / each reading from their own limited cache, each server reads / writes from a common distributed set of caches that they all can share. As long as each server is aware of the same set of “Memcached boxes,” what one server stored in the cache can be read by every other server in the cluster of web servers. The advantage to doing this is immediately apparent: 18 servers reading from the same 30GB of collective cache is more efficient than each server reading from its own smaller local cache.

Memcached (pronounced: Mem-cash-dee), or Memcache-daemon, is a process that listens by default on port 11211. Like httpd (H-T-T-P-daemon), it runs in the background, often started automatically on server load.  A lot of huge websites use Memcached – at least: Facebook, YouTube, and Twitter.

Memcached has external dependencies, so it is best to install it using a package manager like MacPorts (on OS X) or yum (Linux). Package managers give you the ability to type commands like port install memcached and port load memcached to do almost all of the initial setup for Memcached.

Memcached does not have to run on external servers. If your production site uses external servers, and you want to develop locally with Memcached as a local cache, that is just fine.

We’ll come back and discuss more tools for interacting with Memcached once we know a little more about it.

Since WordPress is written in PHP and makes a bunch of expensive SQL queries to its companion MySQL database, we need to figure out how to start taking advantage of Memcache in PHP to store the results of expensive queries, functions, and external HTTP requests in cache.

Memcache PHP Extension

Now that you (maybe) have Memcached installed, you need a way for PHP to talk to it, because it can’t out of the box. You have at least 2 choices for installing PHP extensions:

  1. Package manager
  2. PECL

If you have PECL / PEAR installed, you can run commands like pecl install memcache. Using MacPorts, it will be something more like port install php5-memcache. So what does this get you?

Mainly, access to the Memcache class (after you restart Apache) provided by the PHP extension and a procedural API for add / update / delete / retrieve-ing items from your Memcache server(s). Some examples:

<?php /**  * Object-oriented approach  *  */ $memcache = new Memcache; // connect locally on the default port $memcache->connect( '127.0.0.1', 11211 );  // key = set this item in the cache // value = a string in this case, also supports objects and arrays // false = do NOT use zlib compression to store the value // 30 = the number of seconds to cache the item $memcache->set( 'some_key', 'this is the value I am storing', false, 30 );  // replace / update the value of an item $memcache->replace( 'some_key', 'but this is the value I am updating', false, 90 );  // retrieve an item $memcache->get( 'some_key' );  /**  * Procedural approach (functions not classes)  *  */ $memcache = memcache_connect( '127.0.0.1', 11211 ); memcache_add( $memcache, 'some_key', 'this is the value I am storing', false, 30 ); memcache_set( $memcache, 'some_key', 'this is the value I am storing', false, 30 );  // replace / update the value of an item memcache_replace( $memcache, 'some_key', 'but this is the value I am updating', false, 90 );  // retrieve an item memcache_get( $memcache, 'some_key' );

These functions work just fine, but when using WordPress, we aren’t going to call them directly – these functions will be “abstracted.”

WP Object Cache

WordPress has a cache abstraction layer built-in. What this means is that WordPress has an API for interacting with what is called the WP Object Cache – a PHP class: WP_Object_Cache. The WP Object Cache class is “pluggable” – meaning, if *you* define a class called WP_Object_Cache in your codebase and include it at runtime, that’s the class WordPress will use, otherwise it defaults to WP’s. WordPress also has a procedural API for interacting with the cache object (likely what you’ll use in your code), here’s a peek into future code you may write:

<?php  // // Function (or "template tag") to abstract the fetching of data. // Data comes from cache, or call is made to db then cached. // wp_cache_set( key, value, cache_group, expires (n seconds) ) //  function get_expensive_result() {  global $wpdb;   $key = 'expensive_query';  $group = 'special-group';  $response = wp_cache_get( $key, $group );   if ( empty( $response ) ) {  // add the result of an expensive query  // to the cache for 3 hours  $response = $wpdb->get_results(.....);  if ( !empty( $response ) )  wp_cache_set( $key, $response, $group, 60 * 60 * 3 );  }  return $response; }  $data = get_expensive_result();

WP Object Cache is agnostic as to how it is implemented. Meaning, it does either a) whatever the default behavior is in WP, which is to “cache” non-persistently or b) do whatever your WP Object Cache (your “pluggable” override) class says to do.

Here’s the catch – it won’t do anything until you add this to wp-config.php:

define( 'WP_CACHE', true );

Here’s the other catch – all that will do is try to load wp-content/advanced-cache.php and wp-content/object-cache.php which we haven’t installed yet. Those files are typically made available by a persistent cache plugin (we want our cached items to be available across page loads until they expire – duh), but let’s pause and come back to this subject a little later.

Transients API

The Transients API in WordPress is an abstraction of an abstraction. Memcached should always be viewed as a “transient cache,” meaning that sometimes you will request data, and it won’t be there and will need to be re-cached. The Transients API has a simple procedural API to act on items. It is actually the exact same thing as wp_cache_*, and even allows you to pass in expiration, it just doesn’t allow you to specify a group (‘transient’ is the group). It is really an exercise in semantics. An advantage: if you aren’t using a WP Object Cache backend (a persistent cache plugin), your “transients” will get stored in the wp_options table of your site’s WP database.

<?php // Transients procedural API set_transient( 'woo', 'woo' ); update_transient( 'woo', 'hoo' ); get_transient( 'woo' ); delete_transient( 'woo' );  // multisite get_site_transient( 'multi-woo' );  // behind the scenes, this is happening wp_cache_set( 'woo', 'woo', 'transient' ); wp_cache_set( 'woo', 'hoo', 'transient' ); wp_cache_get( 'woo', 'transient' ); wp_cache_delete( 'woo', 'transient' );

I typically use Transients when I want to store something for an extremely short period of time and then manually delete the item from the cache. Here’s an example:

<?php function this_takes_90_secs_to_run_in_background() {  if ( !get_transient( 'locked' ) ) {  // this function could get called 200 times  // if we don't set a busy indicator  // so it doesn't get called on every page request  set_transient( 'locked', 1 );   // do stuff....   // ok I'm done!  delete_transient( 'locked' );  } }  add_action( 'init', 'this_takes_90_secs_to_run_in_background' );

Could this exact same thing have been accomplished by using wp_cache_* functions? You betcha, because they were (behind the scenes)! Like I said, I use Transients in specific instances – it’s really an issue of semantics.

So our next step is to make WordPress ready to start caching.

Memcached plugin / WP Object Cache backend

Wouldn’t you know it? There’s a plugin that implements WP Object Cache / Memcache from one of the lead developers of WordPress, Ryan Boren. It’s not really a “plugin” – it’s a drop-in file. Once you download the plugin, move object-cache.php into the wp-content directory, and you have pluggably-overriden WP Object Cache. If you are brave and actually look at the code in the lone file, you will notice a bunch of functions (a procedural API) for interacting with the WP Object Cache object (an instance of the Memcache class).

You will also notice that at it’s core, it is just calling the methods of the Memcache class, but it has abstracted these steps for you. It works with Multisite and has intelligently cooked up a way to cache by blog_id, group, and key. You get caching by blog_id for free, there is nothing you need to do for this to work.

Caching by group is really “namespacing” your keys. Let’s say you want to call 10 different things in your cache “query” – your choices for providing context are a) using a longer key like “bad-query” or b) just using “query” and adding the group “bad” into the fold:

<?php wp_cache_set( 'bad-query', 'something' ); wp_cache_set( 'query', 'something', 'bad' );

This is where cache and transients completely overlap. Since you can’t specify a group with transients, “bad-query” would be your only option for the key to avoid name collision. Like I said, it is all semantics.

So we know we can call wp_cache_delete( $key, $group ) to delete an item from the cache, right? So that must be why groups are helpful as well, to remove a bunch of things from the cache at once? Nope. You can’t remove a group of items from the cache out of the box. Luckily, this infuriated me enough that I wrote a plugin that will do this for you. More in a bit, we still need to obtain an advanced-cache.php file.

Batcache

The advanced-cache.php piece of the puzzle is implemented by Batcache. Batcache is a full-page caching mechanism and was written by Andy Skelton from Automattic. WordPress.com used to host Gizomodo’s live blogs, because it would go down on its own architecture during Apple keynotes after ridiculous spikes in traffic. The idea is this: if a page on your site is requested x number of times in an elapsed period of time, cache the entire HTML output of the page and serve it straight from Memcached for a a defined amount of time. Batcache is a bonafide plugin, but the advanced-cache.php portion is a drop-in that should be moved to the wp-content directory.

Batcache will serve these fully-cached pages to anonymous users and send their browser a Cache-Control: max-age={MAX_AGE_OF_PAGE}, must-revalidate; HTTP header. There are some dangers you should be aware of when serving highly-cached pages from a dynamic website.

Batcache has a class member array called $unique which you should populate with values that would ordinarily make your page display different content for different users: Regionalization, perhaps Browser alias, country of origin of User, etc. If you are getting fancy and adding classes to the <body> tag based on browser, and you don’t add those classes to the $unique array in Batcache, you may end up serving HTML pages with an “ie ie7” class in the class attribute of the <body> tag to most of your users, regardless of what browser they are actually using. Fail.

Batcache serves these pages to “anonymous” users only. How does it know they are anonymous? It looks in the $_COOKIE super-global for some WordPress-specific cookies.

// Never batcache when cookies indicate a cache-exempt visitor. if ( is_array( $_COOKIE) && ! empty( $_COOKIE ) ) {  foreach ( array_keys( $_COOKIE ) as $batcache->cookie ) {  if ( $batcache->cookie != 'wordpress_test_cookie' &&  (  substr( $batcache->cookie, 0, 2 ) == 'wp' ||  substr( $batcache->cookie, 0, 9 ) == 'wordpress' ||  substr( $batcache->cookie, 0, 14 ) == 'comment_author'  )  ) {  return;  }  } }

That’s all well and good unless you have implemented a custom authentication system like we have at eMusic.

The advanced-cache.php file that ships with Batcache is really a starting point. I know it may seem daunting or too complicated to dig into someone else’s plugin code, but if you are using Batcache, your site begs another level of skill and coding.

Using Memcached at eMusic

At eMusic, we use 4 dedicated Memcached servers in production – combined equaling ~28GB of RAM. When you have THAT much memory to interact with, some interesting things can happen. Here are few:

  • Your keys with no expiration will seemingly never expire until the cache starts evicting LRU (Least Recently Used) keys. Lesson learned here… always indicate expiration!
  • If you didn’t divide your keys up into a bunch of smaller groups, try to flush one portion of the cache will end up flushing tons of data that doesn’t need to be refreshed and might send a blast of traffic to your database cluster or web service tier. Lesson learned here… use MANY cache groups.
  • If you aren’t updating or deleting cache keys in your code at all, you may find that you end up with stale data often. Especially if you work with an editorial team / writers. They’ll regularly come to you with a “hey, my data is not updated on the live site!”
  • Don’t assume WordPress is getting it right when it comes to caching its own data, dig in find out how it really works. You may (will) find some objectionable things.

Johnny Cache

Remember how I said that you can’t “flush” the cache by cache group? Turns out that’s a big problem for us. Why? If we roll code or add / change a feature, we sometimes want to clear a certain cache to reflect a certain change.

Cache groups are a WordPress concept, not a Memcached concept. WordPress adds the group names to keys by convention, so if you know how to parse and create keys like the Memcached WP Object Cache backend, you can sort through the keys on your Memcached servers and group them together yourself to inspect them in the admin. If you have a list of keys for a group, you can loop through them and call wp_cache_delete( $key, $group ) on each.

Here’s some Memcache extension code to retrieve keys:

<?php $memcache = new Memcache(); $memcache->connect( $server, '11211' ); $list = array(); $allSlabs = $memcache->getExtendedStats( 'slabs' ); $items = $memcache->getExtendedStats( 'items' ); foreach ( $allSlabs as $server => $slabs ) {  foreach( $slabs as $slabId => $slabMeta ) {  $cdump = $memcache->getExtendedStats( 'cachedump', (int) $slabId );  foreach( $cdump as $keys => $arrVal ) {  if ( !is_array( $arrVal ) ) continue;  foreach( $arrVal as $k => $v ) {  $list[] = $k;  }  }  } }

The Memcached backend creates keys like so:

// blog_id:group:key 1:catalog:artist-info-246809809

To parse the list of keys and sort them into groups, try this:

<?php $keymaps = array(); foreach ( $list as $item ) {  $parts = explode( ':', $item );  if ( is_numeric( $parts[0] ) ) { 	$blog_id = array_shift( $parts ); 	$group = array_shift( $parts );  } else { 	$group = array_shift( $parts ); 	$blog_id = 0;  }   if ( count( $parts ) > 1 ) { 	$key = join( ':', $parts );  } else { 	$key = $parts[0];  }  $group_key = $blog_id . $group;  if ( isset( $keymaps[$group_key] ) ) {  $keymaps[$group_key][2][] = $key;  } else { 	$keymaps[$group_key] = array( $blog_id, $group, array( $key ) );  } }  ksort( $keymaps ); foreach ( $keymaps as $group => $values ) {  list( $blog_id, $group, $keys ) = $values;  foreach ( $keys as $key ) {  .........  } }

Johnny Cache is the front-end I wrote for the WP Admin to do this. It allows you to select one Memcached server at a time. Once selected, the servers keys (not values) are retrieved then parsed and ordered by group and blog. The plugin allows you to do the following:

  • Flush keys by cache group
  • Remove single items from the cache
  • View the contents of single items in the cache
  • Flush the cache for a specific user by User ID – helpful if you made a change by hand in the database for a specific user

Johnny Cache is still a work in progress, but flushing cache by group was important enough that I wrote my own code to handle it.

Minify-cation

Working in a load-balanced environment is a lot different than working on one server. This is no clearer than when working with tools that expect for you to dynamically create static files on the server and then point a URL directly at them. Almost all of the time, this doesn’t work. Also, if the generation of the static files is expensive, this is a task best performed once, cached, and then have the results shared with every other server.

I wrote a plugin called Minify that magically grabs all of your page’s scripts and styles, hashes the src names to create an identifier, and then combines the styles or scripts into one file and runs them through some minification classes.

I get around having to serve flat files by creating a rewrite which points to a “make” file. The make file either reads the result of this smashing-together-of-sources, or does the smashing and then saves / serves the result. The advantage here is that every request for our JavaScript and CSS comes straight out of Memcached.

Gotcha alert! To cache-bust a CDN like Akamai, you need to change the file name every time you roll new code to make sure your users aren’t getting served cached files. Query strings suck for that, so I made an increment part of the rewrite ( get_site_option( 'minify:incr' ) ). Our paths end up looking like:

http://www.emusic.com/wp-content/cache/minify-bdda2ca041434058e578f7b84eb7482b-23875598.css  // here's how it is translated http://{HOST}/wp-content/cache/minify-{HASH}-{INCR}.{EXTENSION}

Works for both JavaScript and CSS. It’s magic.

Sitemaps

Same concept. If I want to serve google-news-sitemap.xml, I make a rewrite that points to google-news-sitemap.php. If it is in the cache, serve it, otherwise build it, store it, then serve it.

Memcached on the command line

One final note on interacting with Memcached servers: you can telnet to a server and use the command line tools bundled with it.

$ telnet localhost 11211 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. get foo VALUE foo 0 2 hi END stats STAT pid 8861

More here. Also take a look at Memcache-top.

Conclusion

There is no “definitive” way to use cache, so experiment and think through your caching strategy. A finely-tuned cache will drastically improve your website’s resilience and performance.

scotty-t.com


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

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