28.11.2017

PHP и Memcached на Ubuntu server

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

Если у Вас возникли вопросы, задавайте их в комментариях

Комментариев нет:

Отправить комментарий