Memcached – свободно распространяемое ПО для кеширования данных в оперативной памяти, основываясь на хеш-таблицах. Официальный сайт проекта https://www.memcached.org/
Memcached можно использовать в популярной CMS WordPress, подключив соответствующий плагин. Также данноt кеширование используется в работе таких «гигантов» сети, как Википедия (http://www.wikipedia.org/) и Живом журнале (https://www.livejournal.com/)
В чем же преимущество Memcached? Гораздо быстрее «достать» готовый результат работы скрипта или результат выполнения запроса к базе данных из оперативной памяти, чем выполнять данные вычисления. Особенно это касается тех случаев, когда одна и та же операция повторяется и ее результат практически не изменен (например формирование меню навигации для нескольких нескольких групп пользователей), когда у Вас на сайте 1000 посетителей в день, разница в скорости работы может быть не заметна, но когда количество посетителей превысит 10 000, кеширование ряда элементов сможет существенно снизить нагрузку на сервер.
Исходные данные:
- Ubuntu Server 16.04
- PHP 7.0
1. Установка и настройка Memcached
sudo apt-get install memcached libmemcached-dev
- memcached – сам сервер
- libmemcached-dev – библиотека для подключения к серверу и работы с ним
Конфигурационный файл /etc/memcached.conf
Основные параметры, на которые я рекомендую обратить внимание
-d # Указывает, что Memcached работает в режиме демона
logfile /var/log/memcached.log #Ведем лог использования, полезно при отладке работы скриптов
-m 64 # Объем памяти в Мб, доступный для работы Memcached, устанавливайте это значение в зависимости от доступной оперативной памяти. При установке значения данного параметра следует учитывать сколько оперативной памяти используют другие сервисы (например Базы данных). Я предпочитаю устанавливать около 10-12% от объема оперативной памяти (для 4 Гб ОЗУ – 256 Мб)
-p 11211 # Номер порта, на котором работает Memcached
-u memcache # С под какого пользователя запускается сервис
-l 127.0.0.1 # Какие IP-адреса слушает, при доступе только с локального хоста – оставляйте без изменений, если доступ необходим с внешних устройств укажите IP-адрес сетевого интерфейса или закомментируйте
# -M # данный параметр отвечает за действия с кэшированными данными, когда закончится память. По умолчанию будут удалятся самые старые записи, если его включить, за состоянием памяти сервера нужно будет следить в ручном режиме и в случае когда вся доступная память будет занята – будете получать ошибку. Не рекомендую включать данный параметр.
После завершения изменения файла конфигурации сервис нужно перезапустить.
sudo service memcached restart
Проверить работоспособность Memcached можно, подключившись к нему через Telnet
$ telnet localhost 11211
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set foo 1 60 4
test
STORED
get foo
VALUE foo 1 4
test
END
^]
telnet> Connection closed.
Пояснения
set foo 1 60 4 – создаю запись foo со сроком жизни в 60 секунд (0 – без ограничения по времени, до удаления системой), длинной в 4 байта, следующей командой вводится значение, в примере: test
get foo – получаю значение записи с именем foo
Для выхода Ctrl+]
На этом завершим знакомство с Memcached через командную строку
2. Установка расширения PHP для работы с Memcached
Данное расширение устанавливается при помощи утилиты pecl
Будьте внимательны: в репозитории pecl есть 2 расширения с очень похожими названиями: memcached (рабочий вариант) и memcache (не поддерживается с 2013 года)
sudo pecl install memcached
На заданный вопрос о директории нажимаем Enter
Для корректной установки и работы необходимо, чтобы был установлен пакет libmemcached-dev
Включаем установленное расширение в PHP
echo "extension=memcached.so" >> /etc/php/7.0/mods-available/memcached.ini
phpenmod memcached
service apache2 restart
Открываем в браузере страницу с выводом php_info(); и ищем секцию «memcached», должно вывести приблизительно следующее:
3. Пример использования
Ниже привожу листинг скрипта, в котором показаны основы работы с некоторыми пояснениями
<?php
# Создаем объект для работы с Memcached
$memcached = new Memcached();
# Подключаемся к нашему серверу, можно добавить несколько серверов. В нашем примере добавляем один и работать будем с одним
$memcached->addServer("localhost", 11211);
# Для добавления записи используется 3 процедуры add() set() и replace()
# add() - добавляет новую запись, в случае, если запись с таким ключом существует, вернет false
# set() - устанавливает значение записи по ключу, на ее работу не влияет, существует запись или нет
# replace() - заменят значение существующие записи, если запись не существует, вернет false
# Ниже примеры для добавления числа, строки, массива и объекта. Метод getResultMessage() возвращает сообщение с результатом выполнения
echo ($memcached->add("its_integer", rand(0, 1000))) ? "Добавили число" : "Ошибка добавления числа ".$memcached->getResultMessage() ;
echo '</br>';
echo ($memcached->set("its_string", "test string...")) ? "Добавили строку" : "Ошибка добавления строки ".$memcached->getResultMessage() ;
echo '</br>';
echo ($memcached->replace("its_array", array("v1"=> rand(0, 1000), "v2"=>"test"))) ? "Добавили массив" : "Ошибка добаления массива ".$memcached->getResultMessage() ;
echo '</br>';
echo ($memcached->set("its_object", new stdClass())) ? "Добавили объект" : "Ошибка добавления объекта ".$memcached->getResultMessage();
echo '</br>';
# для получения записи используется get() , для получения одного значения и getMulti() для получения массива значений по перечню ключей
var_dump($memcached->get("its_integer" ));echo '</br>';
var_dump($memcached->get("its_string" ));echo '</br>';
var_dump($memcached->getMulti(array("its_array","its_object") ));echo '</br>';
#Удаляем запись по ключу, если нужно полностью очистить все записи, используем flush()
$memcached->delete("its_integer");
# отключаемся от сервера
$memcached->quit ();
?>
Результат выполнения
Добавили число
Добавили строку
Добавили массив
Добавили объект
int(36)
string(14) "test string..."
array(2) { ["its_array"]=> array(2) { ["v1"]=> int(753) ["v2"]=> string(4) "test" } ["its_object"]=> object(stdClass)#2 (0) { } }
Для ознакомления со всеми функциями и их параметрами рекомендую ознакомиться с официальной справкой http://php.net/manual/ru/class.memcached.php
Если у Вас возникли вопросы, задавайте их в комментариях
Комментариев нет:
Отправить комментарий