Thank you for reading this post, don't forget to subscribe!
Memcached — связующее программное обеспечение, реализующее сервис кеширования данных в оперативной памяти на основе парадигмы хеш-таблицы
Это программное обеспечение, предназначенное для кеширования данных в оперативной памяти. В проекции веб-разработки это может помочь так: без кеширования один и тот же код будет генерироваться на сервере заново для каждого посетителя сайта. На генерацию уходят ресурсы хостинга. Если посетителей становится много, это заметным образом сказывается на производительности системы.
С помощью Memcached возможно один раз сгенерировать код сайта и хранить его результат в оперативной памяти, и когда очередной посетитель обратится к сайту, то хостинг, вместо того, чтобы генерировать всё заново, отдаст копию (кеш), хранящуюся в оперативной памяти. Логично, что чем больше нагрузка на сайт, тем больше пользы от Memcached.
Если у вас не высоконагруженный проект, то стоит подумать над тем, стоит ли использовать Memcached, ведь на подключение к нему уходит дополнительное время. Подумайте, будет ли это оправданно.
Ещё Memcached плох тем, как бы это ни звучало странно, что он отъедает оперативную память. Допустим, если вы отвели 200Mb под него, то считайте, что 200Mb уже нет на вашем хостинге. Так что, на это тоже стоит обратить внимание.
Под Memcached чаще понимают сервер, когда как memcache — это расширение PHP. Хотя, есть и memcached — расширение PHP.
Когда не стоит использовать Memcached
Кеширование снижает гибкость приложений, поэтому на начальных этапах развития проекта не нужно уделять этому слишком много внимания. Не забывайте о правильном подходе, а именно, про использование функций и классов при работе с данными, создание обёрток при работе с внешним API. Оставляйте возможность быстрого внедрения memcached или иного кеширующего метода в код.
Чем отличаются memcached и memcache
Под Memcached чаще понимают кеширующий сервер, когда как memcache — это расширение PHP, предназначенное для работы с этим сервером. Хотя, есть и memcached — расширение PHP.
Чтобы не запутаться, распишем подробнее
- Кеширующий сервер Memcached
- Расширение Memcache
- Расширение Memcached
Различия между этими двумя расширения небольшие
- Memcache старше: его разработка началась в 2004 году. Memcached разрабатывается с 2009
- Memcache используется много чаще, чем Memcached.
- Memcache ограниченней Memcached и не использует возможности сервера Memcached в полную силу (собственно, поэтому и началась разработка расширения Memcached).
- Однако, поэтому Memcache легче и производительней Memcached (судя по заявлениям специалистов, разница порядка 10%)
Чем отличаются memcached и memcache
Под Memcached чаще понимают кеширующий сервер, когда как memcache — это расширение PHP, предназначенное для работы с этим сервером. Хотя, есть и memcached — расширение PHP.
Чтобы не запутаться, распишем подробнее
- Кеширующий сервер Memcached
- Расширение Memcache
- Расширение Memcached
Различия между этими двумя расширения небольшие
- Memcache старше: его разработка началась в 2004 году. Memcached разрабатывается с 2009
- Memcache используется много чаще, чем Memcached.
- Memcache ограниченней Memcached и не использует возможности сервера Memcached в полную силу (собственно, поэтому и началась разработка расширения Memcached).
- Однако, поэтому Memcache легче и производительней Memcached (судя по заявлениям специалистов, разница порядка 10%)
Что лучше использовать, Memcache или Memcached
Если функционала Memcache хватает (а в большинстве случаев так и бывает), то используйте Memcache, он быстрее и легче. Если нужны дополнительные возможности, Memcached — ваш выбор.
Установка memcache в PHP
pecl install memcache
если pecl не установлен то:
yum install php-pear php-devel zlib-devel
yum install pecl
после чего запускаем
pecl install memcache
После этого прописываем нужный путь и расширение в php.ini
extension_dir = "/usr/lib/php/modules/memcache.so"
extension = memcache.so
после перезапускаем apache
/etc/init.d/httpd restart
Установка memcacheD сервера
yum install memcached
Откройте файл /etc/sysconfig/memcached:
nano /etc/sysconfig/memcached |
Найдите параметр OPTIONS="" и впишите в кавычки -l 127.0.0.1. В итоге у вас должно получиться:
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 127.0.0.1" |
MAXCONN="2048" Максимальное количество подключений
CACHESIZE="4096" Количество фактической ОЗУ на сервере
Добавляем memcached в автозагрузку
chkconfig memcached on
Запускаем memcached и перезапускуем apache
service memcached start
service httpd restart
Проверяем работоспособность службы (ошибок быть не должно)
php -i |grep memcache
/etc/php.d/memcache.ini,
memcache
memcache support => enabled
memcache.allow_failover => 1 => 1
memcache.chunk_size => 8192 => 8192
memcache.default_port => 11211 => 11211
memcache.default_timeout_ms => 1000 => 1000
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => standard => standard
memcache.max_failover_attempts => 20 => 20
Registered save handlers => files user memcache
Если у вас при выполнении команды php -i |grep memcache вылазят ошибки , то здесь необходимо пересобрать модуль расширения php-pecl-memcache, вручную:
1. Сначала удалим php-pecl-memcache из системы
# yum remove php-pecl-memcache
2. Теперь приступим к установке модуля:
Скачаем модуль к себе в папочку
# wget http://pecl.php.net/get/memcache-2.2.5.tgz
Разархивируем
# tar -xvf memcache-2.2.5.tgz
# cd memcache-2.2.5
Скомпилируем (должны быть установлены библиотеки gcc и gcc-c++)
# phpize && ./configure --enable-memcache && make && make install
Если не компилируется и ругается на отсутствие ZLIB, то доустановите его – yum install zlib-devel (либо yum install openssl-devel)
Добавим в php.ini, строчку extension = memcache.so, для активации модуля
# echo «extension = memcache.so» >> /etc/php.ini
Закрываем Memcached от доступа извне
Как вы видите, memcached висит на 11211 порту по умолчанию. Так как в memcached нет встроенных механизмов аутентификации, то выходит, что любой может подсоединиться извне и использовать его в своих целях. Чтобы избежать этого, вы можете либо закрыть порт 11211 с помощью фаервола, либо сконфигурировать memcached-сервер, чтобы он мог использоваться только с локального хоста. Ниже описан последний способ.
- Открываем конфигурационный файл 1nano /etc/sysconfig/memcached
- Добавляем строку OPTIONS="-l 127.0.0.1"
- Перезагружаем memcached 1
service memcached restart
или
1/etc/init
.d
/memcached
restart
И снова проверяем
1
|
netstat -tap | grep memcached |
В итоге мы должны увидеть подобное
1
|
tcp 0 0 localhost.localdo:11211 *:* LISTEN 13092 /memcached |
Также, после всех изменений не забудьте перезапустить Apache
Увеличиваем объём рабочей памяти Memcached
По умолчанию, в Memcached отведено на использование 64 мегабайта оперативной памяти. Я увеличу до 1024, вы исходите из параметров вашего сервера
- Открываем конфигурационный файл 1nano /etc/sysconfig/memcached
- Находим значение 1
CACHESIZE="64"
- Меняем его на 1CACHESIZE="128"
- Перезапускаем memcached 1
service memcached restart
Переходим к установке библиотеки php для работы с memcached. Для этого выполните команду:
yum install php-pecl-memcache |
Перезагрузите сервер:
service httpd restart |
Хранение сессий PHP в Memcached
Если одним сервером или кластером Memcached пользуются несколько разных сайтов, то они могут перехватывать сессии друг друга и получать доступ к аккаунтам их пользователей, что представляет собой потенциальную опасность
Можно ускорить php, перенеся хранилище сессий из hdd в оперативную память с помощью memcached
Вы должны знать, какое расширение php вы используете,
memcache
илиmemcached
. Между ними есть разница, а уточнить, что стоит у вас, можно с помощью phpinfo(), тут есть тонкость в настройках, будьте внимательны
Способ для расширения memcache
Смотрим где лежит memcache.ini
php -i | grep memcache | grep ini
/etc/php.d/40-memcache.ini
- Открыть /etc/php.d/40-memcache.ini
- Добавить
12
session.save_handler = memcache
session.save_path =
"tcp://127.0.0.1:11211"
- Перезагрузить apache 1
service httpd restart
Способ для расширения memcacheD
- Открыть /etc/php.d/40-memcache.ini
- Добавить
12
session.save_handler = memcached
session.save_path =
"127.0.0.1:11211"
- Перезагрузить apache 1
service httpd restart
Проверка phpinfo
Теперь нужно проверить, что имеем на выходе. Для этого, открываем страницу с phpinfo() и ищем в коде session.save_path
в столбце с локальными значениями. В значении должно быть tcp://127.0.0.1:11211
или 127.0.0.1:11211
. Если значения не поменялись, смотрите конфиг домена в Апаче и ищем
php_admin_value session.save_path
Кстати, также вы можете воспользоваться директивой php_value
, чтобы настраивать не весь сервер глобально, а только конкретные сайты. Для этого, вы можете отредактировать .htaccess
в корне вашего сайта
1
2
|
php_value session.save_handler "memcache" php_value session.save_path "tcp://127.0.0.1:11211" |
Как проверить работу Memcached
Создадим в корне сайта файлик memcachetest.php и запишем туда следующий код
<?php
if (!class_exists("Memcache")) exit("Memcached не установлен");
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or exit("Невозможно подключиться к серверу Memcached");
$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Не получилось оставить запись в Memcached");
echo "Записываем данные в кеш Memcached (данные будут храниться 10 секунд)<br/>\n";
$get_result = $memcache->get('key');
echo "Данные, записанные в Memcached:<br/>\n";
var_dump($get_result);
?>
Теперь осталось проверить результаты: http://example.com/memcachetest.php
Если всё сделали правильно, увидите что-то вроде:
Server's version: 1.4.4
Записываем данные в кеш Memcached (данные будут храниться 10 секунд)
Данные, записанные в Memcached:
object(stdClass)#3 (2) { ["str_attr"]=> string(4) "test" ["int_attr"]=> int(123) }
phpMemcachedAdmin — мониторинг, статистика и управление Memcached
phpMemcachedAdmin — это программное обеспечение, предоставляющее веб-интерфейс для мониторинга и управления сервисом Memcached на Linux. Позволяет видеть в реальном времени статистику для всех поддерживаемых сервером операций: get, set, delete, increment, decrement, reclaimed, evictions, cas, а также серверную статистику: сеть, позиции, рабочую версию вкупе с чартами и внутренней серверной конфигурацией.
Установка и настройка phpMemcachedAdmin
Тут можно пойти несколькими путями: выделить отдельный домен или поддомен под работу этого сервиса. А можно сделать поддиректорию в рабочем сайте и поставить пароль на неё или настроить ограничение по IP. Я опишу последний способ с установкой пароля на папку как более простой.
допустим, у нас есть сайт http://test.t
cd /var/www/user1/site/test.t |
Создаём директорию и переходим в неё
1
|
mkdir phpMemcachedAdmin && cd phpMemcachedAdmin |
Скачиваем последнюю версию дистрибутива
wget https://www.dropbox.com/s/z9688ktr3vy8jii/phpMemcachedAdmin-1.2.2-r262.tar.gz?dl=0
или отсюда:
phpMemcachedAdmin-1.2.2-r262.tar
Распаковываем:
tar
-xvzf phpMemcachedAdmin-1.2.2-r262.
tar
.gz
Рекурсивно выставляем нужные права доступа в текущей директории
1
2
|
find ./ - type f - exec chmod 0644 {} \; find ./ - type d - exec chmod 0755 {} \; |
Создаём .htaccess для авторизации по паролю (в строку 4 вносите свой логин)
1
2
3
4
|
AuthType Basic AuthName "Private Area" AuthUserFile .htpasswd Require user memcachedmanager |
Создаём .htpasswd
1
|
htpasswd -c .htpasswd memcachedmanager |
Вводите свой пароль.
На этом всё. Логин на каталог memcachedmanager
, если вы не меняли его. Открываете http://test.t/phpMemcachedAdmin
(домен меняете на свой), вводите логин/пароль и пользуетесь